正则表达式,最后是一个逃脱的结束括号

时间:2015-09-30 17:09:27

标签: java regex

这是一个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"似乎只会失败。

有什么我做错了吗?或者有什么东西能达到同样的目标吗?

谢谢和问候

3 个答案:

答案 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)