我需要匹配不以特定字符集结尾的字符串(文件扩展名)

时间:2019-01-13 17:26:57

标签: regex powershell

对于Exchange Online规则,我试图在PowerShell中创建一个匹配(-match)不以'.pdf'结尾的情况的正则表达式。遗憾的是,我对正则表达式还没有足够的经验。我正在使用以下正则表达式测试站点进行测试。

http://regexstorm.net/tester

似乎与从PowerShell regex获得的输出匹配。

我已经尝试了以下方法:.?[^\.pdf]$

这是我得到的输出:

  • "test.txt" -match '.?[^\.pdf]$'→正确(这就是我想要的)
  • "test.docx -match '.?[^\.pdf]$'→正确(这就是我想要的)
  • "test.pdf.txt -match '.?[^\.pdf]$'→正确(这就是我想要的)
  • "test.pdf" -match '.?[^\.pdf]$'→错误(这就是我想要的)

使用以下示例开始失败:

  • "test.pdd" -match '.?[^\.pdf]$'→错误(这不是我想要的)
  • "test.pdx" -match '.?[^\.pdf]$'→错误(这不是我想要的)

我也尝试过类似'.?(\.[^pP][^dD][^fF])$'的许多事情,但是我遇到了类似的结果。

2 个答案:

答案 0 :(得分:2)

更简单的方法是使用-notmatch运算符而不是-match。这使您只需编写

$s -notmatch '\.pdf$'

或者,您也可以将-notlike与通配符一起使用:

$s -notlike '*.pdf'

答案 1 :(得分:0)

要拒绝仅以.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这样的字符序列,您需要以一种否定的眼光看待我用过。

.?表示任何零或一次字符,都不是您想要的正确字符。