Java 结尾处带有转义结束括号的正则表达式

Java 结尾处带有转义结束括号的正则表达式,java,regex,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(pa

这是一个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;
}
以下模式不适用:

\\\\bM\\\\(x\\\\)\\\\b
我喜欢使用
\\b
,这样我可以找到与文本
“M(x)=abc”
匹配的,而不是
“TM(x)=abc”
。这真的很有趣,在我所做的所有测试中,
“\\b”
似乎只有在前面的字符是转义括号时才会失败

我做错什么了吗?还是有什么东西可以达到同样的目标

感谢和问候

请参见,\b是一个单词边界锚。换句话说,它在单词字符(字母、数字、下划线)和非单词字符(其余字符)之间标记一个位置

关键是,')和“”(空格字符)都是非单词字符,因此它们之间没有单词边界。如果你期望它出现在你的模式中,它就会失败

因此,您可以从模式中删除尾随的\b,将其转换为

 \\bM\\(x\\)

结尾
\b
在您的案例中不起作用,因为
\b
匹配:

如果最后一个字符是单词字符,则在字符串中最后一个字符之后。 ()

为什么需要第二个
\b
? 你能提供不同的测试用例和预期结果吗?

试试这个
*?(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)

\b
是单词边界,以及单词和非单词字母(或字符串的开头/结尾)之间的匹配。你可能想使用
\\bM\\\(x\\)\\B
\B
是一个相反的类)。是什么让你认为在
)=
之间有一个单词边界?我有一个通用函数,可以查找文本字符串中的任何“单词/短语”,找到所有出现的单词/短语,然后对其进行处理。。。所以,到目前为止,我很幸运地找到了“单词/短语”。我也很困惑,因为如果我这样做:“M(x)是某物”。replaceAll(“\bM\(x\)\b”,“XYZ”),该函数似乎会找到模式并替换文本。
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));
    }