正则表达式匹配不以[而不是以]结尾的行(ini标题)

时间:2014-05-28 03:17:32

标签: .net regex powershell ini

我正在尝试使用正则表达式在Powershell中编写一个where子句,该正则表达式只匹配以[并且不以...结尾](ini标题)开头的行(数组中的项)。

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

以下是我能得到的。它只匹配'test'。

$test | where-object {$_ -match '^(?!\[).+(?<!\])$'}

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

3 个答案:

答案 0 :(得分:3)

<强>问题

[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


注意:我将更改放入非捕获组,这样我就不需要在每个可能的语句周围包含锚^$

答案 1 :(得分:2)

您可以通过使用正则表达式^和$ anchors来简化它,并避免使用外观。 外观操作的效率低于直接匹配,如果直接匹配解决方案可行,则应避免使用。

$test = @('test', '[test]', '[te]st', 'te[st]')
$test -notmatch '^\s*\[.+\]\s*$'

test
[te]st
te[st]

两端的\ s *将占据行中的任何前导或尾随空格。

答案 2 :(得分:0)

难道你不能找到以[并以]结尾的模式,只检查这个单词是否与正则表达式匹配?这将使正则表达式更容易:

\[[^\]]*\]