我试图通过RegEx验证如下......
If Regex.IsMatch(Output, "\b" & "Serial)" & "\b") Then
'do something
end if
但是我得到了这个Argument异常
parsing "\bSerial)\b" - Too many )'s.
我确实理解错误,但我应该如何修改RegEx表达式?
UPDATE。动态生成“Serial”一词。这意味着至少对我来说我可以为另一个角色获得另一个例外。
答案 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
但是,现在这将不再与foo
或This 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