удалите префикс и суффикс и оставьте среднюю строку

#regex #powershell

#регулярное выражение #powershell

Вопрос:

 2018-09-12_@zulire_6600287891371330821
2019-07-14_@alex_marv_660067913713308218755
 

https://regexr.com/5huq8

я пытаюсь удалить все до и после центрального слова [zuliere , alex и т. Д.], Но мое регулярное выражение не работает.

я пробовал это

.*_@(.zulire)_6.

результат, который я пытаюсь получить

 zulire
alex_marv
 

я пытаюсь использовать его в этом powershell

 Get-ChildItem -File |  # Get files
  Group-Object { $_.Name -match '@([^_] )' } |  # Group by part before first underscore
  ForEach-Object {
    # Create directory
    $dir = New-Item -Type Directory -Name $_.Name
    # Move files there
    $_.Group | Move-Item -Destination $dir
  }
Start-Sleep -Seconds 600
 

Комментарии:

1. Просто @([^_] ) может подойти. Или, (?<=@)[^_]

2. я отредактировал вопрос. что делать, если вместо alex только alex_marv

3. Затем @(.*)_d $ или (?<=@).*(?=_d $)

4. а что делать, когда убрать первое и последнее такое, чтобы отчество осталось. я пытаюсь использовать регулярное выражение в powershell таким образом, чтобы оно удаляло первую и последнюю строки и называло папку по отчеству, например [zulire] или [alex_marv] и т.д.

5. Также, $string -replace '.*@(.*)_.*', '$1'

Ответ №1:

Вы можете сопоставить любые символы между @ ними, а за последним _ следует одна или несколько цифр:

 $string = '2018-09-12_@zulire_6600287891371330821'
$string -match '(?<=@).*(?=_d $)' | Out-Null
$matches[0]
# => zulire
 

Смотрите демонстрацию регулярных выражений. Подробные сведения:

  • (?<=@) — местоположение, которому непосредственно предшествует @
  • .* — любые 0 или более символов, отличных от новой строки, как можно больше
  • (?=_d $) — сразу же следует _ и одна или несколько цифр до конца строки.

Если вы настаиваете на -replace решении, используйте

 $string -replace '.*@(.*)_d 

Посмотрите эту демонстрацию регулярных выражений. Здесь,

  • .* - любые 0 или более символов, отличных от новой строки, как можно больше
  • @ - @ символ
  • (.*) - Группа 1 ( $1 ): любые 0 или более символов, отличных от новой строки, как можно больше
  • _ - _ символ
  • d - одна или несколько цифр
  • $ - конец строки.
ПРИМЕЧАНИЕ: Если в конце может быть что-то, но _ , просто замените d $ на .* :
 $string -replace '.*@(.*)_.*', '$1'
 


, '$1'
Посмотрите эту демонстрацию регулярных выражений. Здесь,

  • .* — любые 0 или более символов, отличных от новой строки, как можно больше
  • @ @ символ
  • (.*) — Группа 1 ( $1 ): любые 0 или более символов, отличных от новой строки, как можно больше
  • _ _ символ
  • d — одна или несколько цифр
  • $ — конец строки.

ПРИМЕЧАНИЕ: Если в конце может быть что-то, но _ , просто замените d $ на .* :