#regex #powershell
#регулярное выражение #powershell
Вопрос:
2018-09-12_@zulire_6600287891371330821
2019-07-14_@alex_marv_660067913713308218755
я пытаюсь удалить все до и после центрального слова [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 $
на .*
: