正则表达式在所有.net引擎在线工作,但不在powershell?

时间:2014-10-21 20:49:44

标签: regex powershell

我在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 ?

1 个答案:

答案 0 :(得分:3)

2个问题

1。一个错字:

$re = [regex]'@
...
'@

应该是

$re = [regex]@'
...
'@

2。空白

当你使用像这样的字符串时,行开头的空白计数!你正在把它作为表达的一部分。试试这个:

$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)。