我正在使用Java Pattern类进行一些字符串搜索。 我正在尝试使用java Pattern类匹配包含“c ++”或“c#”的字符串(txt)。
String txt="c++ / c# developer";
Pattern p = Pattern.compile(".*\\b(c\\+\\+|c#)\\b.*" , Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(txt);
while (m.find()) {
...
break;
}
m.find总是假的 我究竟做错了什么? 谢谢 奥弗
答案 0 :(得分:6)
\\b
是一个单词边界。这意味着它匹配单词和非单词字符。 +
和#
都是非单词字符,因此您需要在c++
或c#
后跟一个字母,数字或下划线。请尝试删除\\b
或将其替换为\\B
(这需要+
或#
之后还有另一个非单词字符。
请注意,当您使用find
时,您也不需要.*
。 find
会愉快地返回部分匹配。您的模式将为您提供第一个捕获组中c++
或c#
的最后一次出现。如果这不是您想要的,请删除括号和通配符。
编辑:如果您要添加执行以单词字符结尾的其他选项(例如java
)。最干净的解决方案是根本不使用\\b
或\\B
,而是使用负前瞻创建自己的边界条件。这样你就可以简单地说“如果下一个没有单词字符就匹配”:
\\b(c\\+\\+|c#|java)(?!\\w)
答案 1 :(得分:0)
您可以尝试使用^.*c(\+{2}|\#).*$
。它说找到c
后跟2 +
或#
。您可以看到示例here。