Java 结尾处带有转义结束括号的正则表达式
这是一个java/正则表达式问题 我喜欢使用以下代码段在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
“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));
}