除非它包含某些内容,如何匹配字符串?

时间:2015-05-27 14:57:31

标签: regex powershell

我有一个PowerShell脚本,它将获取文件夹中所有文件的列表,然后(根据Switch语句中的正则表达式匹配)将每个文件移动到指定的文件夹(取决于正则表达式匹配)

我遇到了特定列表的问题。一组以" 40"开头的文件(以其部件编号命名的PDF文件);移动到指定的文件夹。

正则表达式本身对我来说很容易,我遇到的问题是,如果文件包含_ol_ol_,则它不能匹配。

例如,下面的文件名应全部匹配:

401234567.pdf
401234567a.pdf
401234567_a.pdf
401234567a_something.pdf

以下内容不应匹配:

401234567_ol.pdf
401234567_ol_something.pdf

使用^(?i)40\w+[^_ol].pdf$正则表达式是我能得到的最接近的。 它将否定401234567_ol.pdf作为匹配;但是,它接受401234567_ol_something.pdf。有谁知道我怎么能否认这也是一场比赛?

3 个答案:

答案 0 :(得分:3)

你可以在你的正则表达式中使用负向前看。以下正则表达式将匹配任何不包含_ol的字符串:

^((?!_ol).)*$

DEMO

请注意,您需要为多行字符串使用修饰符m(多行)。

答案 1 :(得分:2)

使用否定前瞻:

(?!.*_ol)

请参阅demo

模式开头的前瞻_ol检查字符串后面是否有explode。如果它存在,我们没有匹配。必须转义点以匹配文字点。

答案 2 :(得分:0)

只需使用符合您要排除的模式的-notmatch operator

Get-ChildItem 'C:\source' -Filter '*.pdf' |
  ? { $_.BaseName -notmatch '_ol(_|$)' } |
  Move-Item -Destination 'C:\destination'

-notlike运算符(为了获得更好的性能):

Get-ChildItem 'C:\source' -Filter '*.pdf' |
  ? { $_.BaseName -notlike '*_ol' -and $_.BaseName -notlike '*_ol_*' } |
  Move-Item -Destination 'C:\destination'