2013-04-17 31 views
4

我正在使用Java Pattern类进行一些字符串搜索。 我想匹配包含“C++”或“c#”内部使用java模式类的字符串(txt)。正则表达式搜索包含+或#的字符串使用Java

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总是假 我到底做错了什么? 谢谢 Ofer

+0

将一个样品文字和样品的结果。 – NINCOMPOOP

回答

0

您可以尝试使用^.*c(\+{2}|\#).*$。它说找到一个c,然后是2 +#。你可以看到一个例子here

+0

您应该至少在使用适当引擎的测试程序中提供演示链接:http://www.regexplanet.com/advanced/java/index.html –

+0

@ m.buettner书签,我将使用它用于所有Java正则表达式的例子在未来。 Rubular是我使用过的最干净/最新的一个,因此我使用那个作为快速示例。谢谢。 – Walls

6

\\b是一个字边界。这意味着它匹配一个单词和一个非单词字符。 +#都是非单词字符,因此您需要c++c#后跟一个字母,数字或下划线。尝试删除\\b或将其替换为\\B(这将需要在+#之后有另一个非单词字符)。

请注意,当您使用find时,您也不需要.*find会很高兴地返回部分匹配。你的模式会给你第一个捕获组的最后一次出现c++c#。如果这不是您想要的,请删除括号和通配符。

Working demo.

编辑:如果您添加的做单词字符端(如java)其他替代品。最干净的解决方案根本不是使用\\b\\B,而是使用负向预测创建自己的边界条件。这样,你只是说:“相匹配,如果有下一个无字的字符”:

\\b(c\\+\\+|c#|java)(?!\\w) 

Working demo.

+0

谢谢,当我使用模式\\ b(c \\ + \\ + | c#| java)\\ B它现在找到C++或c#,但是当我尝试匹配字符串“java”时,它失败了之前当我在最后使用\\ b时)。在正则表达式中是否有任何方法将两种方法混合成一个正则表达式? – user2022561

+0

@ user2022561我已经调整了我的答案以适应 –

+0

我使用了第二个选项,现在它在所有情况下都能够完美工作。非常感谢您的帮助 – user2022561

相关问题