Мне нужно сопоставить строку, которая не заканчивается определенным набором символов (расширение файла) - PullRequest
0 голосов
/ 13 января 2019

Для правила Exchange Online я пытаюсь создать регулярное выражение в PowerShell, которое соответствует (-match) любому случаю, который НЕ заканчивается на .pdf. К сожалению, я не настолько опытен с регулярными выражениями. Для тестирования я использую следующий сайт тестирования регулярных выражений.

http://regexstorm.net/tester

Похоже, он соответствует выводу, полученному из регулярного выражения PowerShell.

Я уже пробовал следующее: .?[^\.pdf]$.

Вот что я получу за вывод:

  • "test.txt" -match '.?[^\.pdf]$' & rarr; Правда (это то, что я хочу)
  • "test.docx -match '.?[^\.pdf]$' & rarr; Правда (это то, что я хочу)
  • "test.pdf.txt -match '.?[^\.pdf]$' & rarr; Правда (это то, что я хочу)
  • "test.pdf" -match '.?[^\.pdf]$' & rarr; Ложь (это то, что я хочу)

Он начинает работать со следующими примерами:

  • "test.pdd" -match '.?[^\.pdf]$' & rarr; Неверно (это НЕ то, что я хочу)
  • "test.pdx" -match '.?[^\.pdf]$' & rarr; Неверно (это НЕ то, что я хочу)

Я также пробовал много вещей в соответствии с: '.?(\.[^pP][^dD][^fF])$', но у меня похожие результаты.

Ответы [ 2 ]

0 голосов
/ 13 января 2019

Более простой способ сделать это - использовать оператор -notmatch вместо -match. Это позволяет просто написать

$s -notmatch '\.pdf$'

В качестве альтернативы вы также можете использовать -notlike с подстановочными знаками:

$s -notlike '*.pdf'
0 голосов
/ 13 января 2019

Чтобы отклонить совпадения, заканчивающиеся только на .pdf, вы можете использовать это регулярное выражение,

^(?!.*\.pdf$).*$

с отрицательным прогнозом (?!.*\.pdf$), который отклоняет совпадение, если строка заканчивается на .pdf

Вот результаты ваших команд,

PS C:\Users\user> "test.txt" -match '^(?!.*\.pdf$).*$'
True
PS C:\Users\user> "test.docx" -match '^(?!.*\.pdf$).*$'
True
PS C:\Users\user> "test.pdf.txt" -match '^(?!.*\.pdf$).*$'
True
PS C:\Users\user> "test.pdf" -match '^(?!.*\.pdf$).*$'
False
PS C:\Users\user> "test.pdd" -match '^(?!.*\.pdf$).*$'
True
PS C:\Users\user> "test.pdx" -match '^(?!.*\.pdf$).*$'
True

Ваше использование отрицательного символа [^.pdf] работает только для отрицания определенных символов в строке и не может отклонить последовательность символов, таких как pdf, для которой вам нужно использовать отрицательный взгляд вперед, как я использовал.

И .? означает любой символ ноль или один раз, который не является тем, что вы хотели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...