RegEx To Match“整个单词”返回异常

时间:2010-07-20 11:10:44

标签: regex vb.net validation

我试图通过RegEx验证如下......

If Regex.IsMatch(Output, "\b" & "Serial)" & "\b") Then
'do something
end if

但是我得到了这个Argument异常

parsing "\bSerial)\b" - Too many )'s.

我确实理解错误,但我应该如何修改RegEx表达式?

UPDATE。动态生成“Serial”一词。这意味着至少对我来说我可以为另一个角色获得另一个例外

5 个答案:

答案 0 :(得分:5)

假设是VB.Net,你需要转义)

If Regex.IsMatch(Output, "\b" & "Serial\)" & "\b") Then
    'do something
End If

在.Net正则表达式中,括号是分组字符。


如果正如您所说的那样,动态生成“Serial”一词,在将其传递给RE引擎之前,您必须先escape

If Regex.IsMatch(Output, "\b" & Regex.Escape("Serial)") & "\b") Then
    'do something
End If

正如另一个回答者发布的那样,这与"Serial) xyz"不匹配(例如),因为\b和空格之间没有)\b仅存在< em> \w\W个字符,)和空格\W)。

你可能不得不求助于一个丑陋的黑客:

If Regex.IsMatch(Output, "\s" & Regex.Escape("Serial)") & "\s") _
Or Regex.IsMatch(Output, "\s" & Regex.Escape("Serial)") & "$") _
Or Regex.IsMatch(Output, "^" & Regex.Escape("Serial)") & "\s") _
Or Regex.IsMatch(Output, "^" & Regex.Escape("Serial)") & "$") _
Then
    'do something
End If

我想也许你可以匹配一个由(^$)和\s组成的字符类:

If Regex.IsMatch(Output, "[\s^]" & Regex.Escape("Serial)") & "[\s$]") Then
    'do something
End If

但这似乎不适用于正则表达式测试程序here,因此您可能需要使用丑陋的黑客版本,或者您可以将它们组合成单个正则表达式,如下所示:

var input = "Serial)"
var escaped = Regex.Escape (input)
var regex = "\s" & escaped & "\s|^" & escaped & "$|\s" & escaped & "$|^" & escaped & "\s"
If Regex.IsMatch(Output, regex) Then
    'do something
End If

答案 1 :(得分:4)

Paxdiablo和tanascius'的答案正确解释了为什么你的正则表达式无法编译。

可是:

即使在转义括号后,您也需要小心使用正则表达式:\b仅匹配字边界(由\w快捷方式的字符构造的单词 - 字母,数字和下划线),标点符号后的括号。在您的情况下,正则表达式将不会匹配foo Serial) bar之类的字符串。它将 匹配foo Serial)bar,但仅仅因为\b bar之前的匹配。同样,它与字符串Serial)不匹配。

因此,简单地用\b s围绕一个字符串并不总是能达到您希望它做的那样。

编辑:根据您的评论,如果在以下列表中...

foo Serial) bar
foo (Serial) bar
foo Serial). bar
foo Serial))))))
foo Serial)

...只有第一个和第五个应该匹配,我推断规则是匹配整个单词,只要它在空格或字符串的开头/结尾之前/后面。

在这种情况下,请使用

If Regex.IsMatch(Output, "(?<=^|\s)" & Regex.Escape("Serial)") & "(?=\s|$)") Then

但是,现在这将不再与fooThis is foo.中的He said "foo"匹配。如果您想允许此操作,请使用

If Regex.IsMatch(Output, "(?<=^|\b|\s)" & Regex.Escape("Serial)") & "(?=\s|\b|$)") Then

...但现在这也将与第二个例子相匹配。仔细选择你的武器:)

(解释:(?<=^|\b|\s)是一个积极的lookbehind断言匹配,如果可以匹配字符串的开头,一个单词边界或当前位置之前的空白字符,而不添加任何内容匹配结果。(?=\s|\b|$)是它的先行对手。)

答案 2 :(得分:1)

您应该使用Regex.Escape()

来逃避输入
String input = "Serial)";
If Regex.IsMatch(Output, "\b" & Regex.Escape( input ) & "\b") Then
  'do something
end if

答案 3 :(得分:0)

我认为你需要的可能是

\bSerial\)\b

(即“\ b”&amp;“Serial”)&amp; “\ b”)

答案 4 :(得分:0)

您需要转义括号。也就是说,)) 因此,最终的字符串应该看起来像\ bSerial)\ b

如果内容动态生成,搜索“(”和“)”并用适当的转义字符(只是字符串替换!)替换为“(”和“)”或使用Regex.Escape()来逃避这些字符!

HTH