这是一个java /正则表达式问题。
我想使用以下代码段在java程序的文本字符串中搜索此"M(x)"
:
public static List<String> findPattern(String patternStr, String value)
{
ArrayList<String> matchedStrings = new ArrayList<String>(5);
Pattern pattern = Pattern.compile(patternStr);
Matcher matcher = pattern.matcher(value);
while (matcher.find()) {
matchedStrings.add(matcher.group(0));
}
return matchedStrings;
}
以下模式字符串有效:
M\\\\(x\\\\)
以下模式不会:
\\\\bM\\\\(x\\\\)\\\\b
我喜欢使用\\b
,以便找到与文字"M(x) = abc"
和非"TM(x) = abc"
匹配的内容。这真的很有趣,在我完成所有测试的情况下,如果前面的角色是转义括号,"\\b"
似乎只会失败。
有什么我做错了吗?或者有什么东西能达到同样的目标吗?
谢谢和问候
答案 0 :(得分:1)
请参阅,\ b是字边界锚。换句话说,它在单词字符(字母,数字,下划线)和非单词字符(其余字符)之间标记一个位置。
重点是,&#39;&#39;&#39;和&#39; &#39; (空格字符)是非单词字符,因此它们之间没有字边界。如果你期望它在你的模式中,它就会失败。
所以,您可以从模式中删除尾随\ b,将其转换为...
\\bM\\(x\\)
答案 1 :(得分:0)
结尾\b
不适用于您的案例,因为\b
匹配:
在字符串中的最后一个字符之后,如果最后一个字符是单词字符。 (http://www.regular-expressions.info/wordboundaries.html)
为什么需要第二个\b
?
您能提供不同的测试用例和预期结果吗?
答案 2 :(得分:0)
试试这个.*?(M\(x\))
。 .*?
表示非贪婪匹配。
String txt="sdda2asddaTM(x) = abcsdssdcxc";
Pattern p = Pattern.compile(".*?(M\\(x\\))", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(txt);
if (m.find()) {
System.out.print(m.group(1));
}
你不会得到TM(x)