我在regexstorm(.NET引擎)中测试了下面这个正则表达式并且它有效,但在PowerShell(v2)中它不起作用......为什么?
$str = 'powershell is rock powershell is not rock'
$re = [regex]'@
(?xmin)
^
(
(?> [^i]+ | \Bi | i(?!s\b) )*
\bis\b
){2}
(?> [^i]+ | \Bi | i(?!s\b) )*$
'@
$re.matches($str)
# not return value why ?
答案 0 :(得分:3)
$re = [regex]'@
...
'@
应该是
$re = [regex]@'
...
'@
当你使用像这样的字符串时,行开头的空白计数!你正在把它作为表达的一部分。试试这个:
$str = 'powershell is rock powershell is not rock'
$re = [regex]@'
(?xmin)
^
(
(?> [^i]+ | \Bi | i(?!s\b) )*
\bis\b
){2}
(?> [^i]+ | \Bi | i(?!s\b) )*$
'@
$re.matches($str)
# not return value why ?
在阅读您的评论后,您似乎正在尝试匹配包含单词is
的2个实例的字符串(不多也不少)。
我建议使用更多代码和更少的正则表达式来执行此操作:
$s1 = 'powershell is rock powershell is not rock'
$s2 = 'powershell is what powershell is vegetable is not'
$s3 = 'powershell is cool'
$re = [regex]'\bis\b'
$re.matches($s1).captures.count
$re.matches($s2).captures.count
$re.matches($s3).captures.count
一个更简单的正则表达式,您只需测试$re.matches($str).captures.count -eq 2
(或-ne 2
)。