我花了一些时间,但还是要解决。我需要能够在字符串中匹配带有符号的单词(如c ++)的正则表达式。
我使用过/\bword\b/
,对于“常用”字词,它可以正常使用。但是一旦我尝试/\bC\+\+\b/
它就行不通。一些加号的工作原理是错误的。
我需要一个正则表达式来检测输入字符串是否包含c ++单词。输入如,
"c++ developer"
"using c++ language"
等
PS。使用C#,。Net Regex.Match函数。
感谢您的帮助!
答案 0 :(得分:16)
+
是一个特殊角色,所以你需要逃避它
\bC\+\+(?!\w)
请注意,我们无法使用\b
,因为+
不是单词字符。
答案 1 :(得分:5)
问题不在于加号字符,即您已正确转义,而是\b
序列。它表示单词边界,它是单词字符(字母数字)和其他内容之间的点。 Plus不是单词字符,因此要匹配\b
,最后一个加号后面需要有一个单词字符。
\bC\+\+\b
匹配“Test C ++ Test”但不匹配“Test C ++ Test”。如果您希望在最后一个加号后面有空格,请尝试\bC\+\+\s
之类的内容。
答案 2 :(得分:2)
加号具有特殊含义,因此您必须使用\
将其转义。同样的规则适用于这些字符:\, *, +, ?, |, {, [, (,), ^, $,., #,
和空格
更新:问题在于\b
序列
答案 3 :(得分:0)
正如其他人所说,你的问题不是你已正确转义的+
符号,而是\b
,它是一个零长度字符,匹配字{{{}之间的字边界1}}和非单词\w
char。
你的正则表达式中还有另一个错误,你想要将char \W
(大写)与C
(小写)匹配。为此,你必须将你的正则表达式改为c++
或使用/\bc\+\+/
修饰符来匹配不区分大小写:i
答案 4 :(得分:0)
如果要在非单词字符(字母,数字和下划线以外的字符)之间匹配c++
,则可以使用
\bc\+\+\B
请参见regex demo,其中\b
是word boundary,而\B
匹配不是单词边界位置的所有位置。
C#语法:
var pattern = @"\bc\+\+\B";
您必须记住\b
/ \B
是上下文相关的:\b
在字符串的开头/结尾与相邻的单词char或一个单词与一个非单词chars之间匹配,而\B
在字符串的开头/结尾与相邻的* non- * word字符之间或两个单词或两个非单词chars之间匹配。
如果动态构建模式,则很难依靠单词边界\b
模式。
改为使用(?<!\w)
和(?!\w)
环顾四周,它们将始终匹配未立即在其后/紧随其后的单词char:
var pattern = $@"(?<!w){Regex.Escape(word)}(?!\w)";
如果您要匹配的单词边界是空白边界(即,仅在空白之间才需要匹配),请使用
var pattern = $@"(?<!S){Regex.Escape(word)}(?!\S)";