2

我有一个简单的正则表达式可以将所有匹配项从文本文件返回到文件:

\\Root_Dir.*?

它们以“ \Root_dir”开头并以单引号结尾。它工作正常,但问题是我想排除扩展名为.rep. 根据我阅读的内容,我尝试了:

\\Root_Dir.*?(?!\.rep)'

这仍然包括像\Root_dir\nextdir\happy.rep.

如果可能,我还想在返回的内容中排除结束单引号

我正在使用 PowerShell 2.0,我相信它支持外观。

4

2 回答 2

1

你应该使用否定的lookbehind ..ie你需要在单引号后面寻找任何出现的.rep

\\Root_dir[^']*(?<!\.rep)(?=')
于 2013-01-16T17:32:22.790 回答
0
\\Root_Dir.*?(?!\.rep)'

考虑在字符串中的同一位置(在 之后.*?)要求的内容:

  • 匹配单引号
  • 所以不匹配\.rep

显然,在示例中这将是正确的,因为.*?with 匹配.rep并因此满足了负面展望。

由于 .NET 支持可变宽度环视1,因此您需要先在预视中执行可变宽度部分,然后再单独执行引用:

\\Root_Dir(?!.*?\.rep).*?'

但是,我很想将其分解为:

  1. 以前缀开头:$value.StartsWith("\\Root_Dir")
  2. 如果 #1 为真,则使用正则表达式,后面带有否定的外观:((?<!\.rep)'$即,前面没有...的引号)。

1没有人告诉 PM/dev 其他人认为这太难了。

于 2013-01-16T17:38:27.390 回答