Powershell: оставьте элемент в покое, если регулярное выражение не соответствует - PullRequest
1 голос
/ 18 июня 2009

У меня есть список файлов PDF (из ежедневной обработки), некоторые с отметками даты различного форматирования, некоторые без.

Пример:

$f = @("testLtr06-09-02.pdf", "otherletter.pdf","WelcomeLtr043009.pdf")

Я пытаюсь удалить метку даты, убрав тире, а затем заменяя любую последовательную группу чисел (4 или более, я могу изменить это на 6) строкой «DATESTAMP».

Пока у меня есть это:

$d =  $f | foreach {$_ -replace "-", ""} | foreach { $_ -replace ([regex]::Matches($_ , "\d{4,}")), "DATESTAMP"}
echo $d

Выход:

testLtrDATESTAMP.pdf
DATESTAMPoDATESTAMPtDATESTAMPhDATESTAMPeDATESTAMPrDATESTAMPlDATESTAMPeDATESTAMPtDATESTAMPtDATESTAMPeDATESTAMPrDATESTAMP.DATESTAMPpDATESTAMPdDATESTAMPfDATESTAMP
WelcomeLtrDATESTAMP.pdf

Это прекрасно работает, если в файле есть метка даты, но, похоже, он волнуется -relace и вставляет DATESTAMP после каждого символа. Есть ли способ это исправить? Я пытался изменить его на цикл foreach, но не мог понять, как получить истинное / ложное из регулярного выражения.

Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 19 июня 2009

Вы можете просто сделать:

PS > $f -replace "(\d{2}-){2}\d{2}|\d{4,}","DATESTAMP"
testLtrDATESTAMP.pdf
otherletter.pdf
WelcomeLtrDATESTAMP.pdf
2 голосов
/ 18 июня 2009
$_ -replace ([regex]::Matches($_ , "\d{4,}")), "DATESTAMP"

Значения в $ _ заменяют каждое нахождение ([regex]::Matches($_ , "\d{4,}")) на "DATESTAMP".

Так как в имени файла без метки времени (или, по крайней мере, 4 последовательных чисел) совпадения нет, возвращается "" (пустая строка).

Таким образом, каждая пустая строка заменяется на DATESTAMP. И такая пустая строка "" находится в начале строки и после каждого другого символа.

Вот почему вы получаете эту длинную строку с каждым символом, окруженным DATESTAMP.


Чтобы проверить, существует ли в вашей строке \d{4,}, вы можете использовать

[regex]::IsMatch($_, "\d{4,}")

Я не пользователь Powershell, но эта строка сама по себе должна делать свою работу. Но я не уверен, что смогу использовать if в конвейере и более или менее, и назначение, и echo $ d необходимы

$f | foreach-object {$_ -replace "-", ""} | foreach-object {if ($_ -match "\d{4,}") { $_ -replace "\d{4,}", "DATESTAMP"} else { $_ }}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...