我正在尝试使用正则表达式在Powershell中编写where子句,该正则表达式仅匹配不以[AND不以]结尾的行(数组中的项)(ini头)。

$test = @('test', '[test]', '[te]st', 'te[st]')

以下是我所能得到的。它仅匹配“测试”。
$test | where-object {$_ -match '^(?!\[).+(?<!\])$'}

“test”,“[te] st”和“te [st]”应匹配。谢谢。

最佳答案

问题

[te]st中,初始负前瞻失败。

te[st]中,最终的负向后查找失败。

解决方案

我们需要使用交流发电机|来确保一种或另一种情况都有效。.如果两种环视均失败,则不会获得匹配:

^         (?# match the beginning of the string)
(?:       (?# start non-capturing group)
  (?!\[)  (?# negative lookahead for [)
  .+      (?# match 1+ characters)
 |        (?# OR)
  .+      (?# match 1+ characters)
  (?<!\]) (?# negative lookbehind for ])
)         (?# end non-capturing group)
$         (?# match the end of the string)

Demo

注意:我将轮换放入了一个非捕获组,这样我就不需要在每个可能的语句周围包括 anchor ^$

关于.net - 正则表达式以匹配不以[开头但不以]结尾的行(ini头文件),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23902255/

10-13 08:34