我正在尝试使用正则表达式在Powershell中编写一个where子句,该正则表达式只匹配以[并且不以...结尾](ini标题)开头的行(数组中的项)。
$test = @('test', '[test]', '[te]st', 'te[st]')
以下是我能得到的。它只匹配'test'。
$test | where-object {$_ -match '^(?!\[).+(?<!\])$'}
'test','[te] st'和'te [st]'应匹配。谢谢。
答案 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)
注意:我将更改放入非捕获组,这样我就不需要在每个可能的语句周围包含锚^
和$
。
答案 1 :(得分:2)
您可以通过使用正则表达式^和$ anchors来简化它,并避免使用外观。 外观操作的效率低于直接匹配,如果直接匹配解决方案可行,则应避免使用。
$test = @('test', '[test]', '[te]st', 'te[st]')
$test -notmatch '^\s*\[.+\]\s*$'
test
[te]st
te[st]
两端的\ s *将占据行中的任何前导或尾随空格。
答案 2 :(得分:0)
难道你不能找到以[并以]结尾的模式,只检查这个单词是否与正则表达式匹配?这将使正则表达式更容易:
\[[^\]]*\]