正则表达式来查找包含转义字符的单词
问题描述:
我正在使用简单的正则表达式(在C#中)在文本块中查找整个单词。正则表达式来查找包含转义字符的单词
这个词可能会出现在开头,末尾或在文字或句子在文本的中间。
但是如果这个词包含特殊字符(已逃)它不再工作我一直在使用\bword\b
表达一直工作正常。边界是必不可少的,这样我们就不会像vb.net那样选择与.net相匹配的词语。
两个例子是:
\bc\#\b
\b\.net\b
我可以在开始非空间等改变字边界到其他检查的列表例如不然而这是复杂和如果使用的话可能会很慢上大量的文字。
答
的\b
单词字符和非单词字符之间的边界一致,但不会两个非单词字符之间的边界匹配。
例如,在C#
的情况下,有和#
的C
(单词字符)之间的边界(非字字符),但不是#
和无坚不摧之间后(空格,标点符号,最终字符串等)。
可以按如下方式解决此问题:
- 使用
(?:^|\W)
,而不是在\b
表达的开始。
例如,(?:^|\W)\.NET\b
这将匹配.
之前的字符串开头或非单词字符。 - 在表达式的末尾使用
(?:\W|$)
而不是\b
。
例如,\bC#(?:\W|$)
这将匹配#
字符后的非单词字符或字符串末尾。
答
它不是一个匹配,因为转义字符(#和。)没有字字符,所以没有这个和空白/等之间字 - 边界处(B \)。也许特别寻找空白/ bol/eol/etc?
+0
我已经尝试这样做,它的工作,但是是相当慢的运行这个几百叫板文本 – John 2009-07-17 10:12:07
答
我建议负lookarounds:
(?<!\w)c#(?!\w)
(?<!\w)\.net(?!\w)
这应该是比匹配锚或非单词字符更快,像(?:^|\W)
,再加上你不必处理多余的字符时,它的\W
匹配。
几百段落然而这个工作,因为它是在几千电话相当慢,当我只有一些运行此需要逃脱这是罕见的。谢谢 – John 2009-07-17 10:59:00
@John:如果非单词字符位于搜索词的开始或结尾,则只需要使用这些解决方法。如果该术语仅包含单词字符,或者将非单词字符埋在术语中间的某个位置(例如`f @ t`),那么使用`\ b`就可以。 – LukeH 2009-07-17 11:06:53