我正在尝试在大文字中查找特定短语,但该短语可能包含“[”,“(”,“*”,...,如“name1(name2”)等字符,但在查找时会导致无效的异常。这是我的代码:
Pattern myPattern = Pattern.compile( "\\b" + phrase + "\\b" ); // Exception
Matcher myMatcher = myPattern.matcher( largeText );
我曾尝试使用quote(...)来修复此类字符,但它不起作用:
phrase = Pattern.quote( phrase );
如何修复此问题以允许此类字符?
答案 0 :(得分:2)
Pattern.quote(phrase)
效果很好:
String largeText = "a()b a()c a()b";
String phrase = "a()b";
Pattern myPattern = Pattern.compile( "\\b" + Pattern.quote(phrase) + "\\b" );
Matcher myMatcher = myPattern.matcher( largeText );
while(myMatcher.find()) {
System.out.println(myMatcher.group());
}
打印:
a()b
a()b
答案 1 :(得分:0)
处理短语以逃避所有可能的正则表达式元字符。
答案 2 :(得分:0)
请您提供一个完整的示例来重现此问题?我尝试了以下内容并且工作正常:
String largeText = "large text with name1 (name2) and possibly something more";
String phrase = "name1 (name2";
phrase = Pattern.quote( phrase );
Pattern myPattern = Pattern.compile( "\\b" + phrase + "\\b" ); // Exception
System.out.println("The pattern is " + myPattern.pattern());
Matcher myMatcher = myPattern.matcher( largeText );
if (myMatcher.find()) {
System.out.println("A match is found: " + myMatcher.group());
}
输出结果为:
The pattern is \b\Qname1 (name2\E\b
A match is found: name1 (name2
答案 3 :(得分:0)
您可能只想使用:
int offset = largeText.indexOf(phrase);
测试子字符串的存在/偏移量。
要使用模式,这应该有效:
String longString = "this[that]the other* things";
String phrase = "[that]";
Pattern myPattern = Pattern.compile( "\\b" + Pattern.quote(phrase) + "\\b"));
Matcher m = myPattern.matcher(longString);
if (m.find()) {
System.out.println(m.group());
}
但使用*和时有一点问题?在短语的开头或结尾。
这些字符被视为空白字符(不是字符),因此如果它们出现在短语的开头或结尾,那么为了匹配边界,它们必须包含所有前导/尾随空格。
如果短语在开头或结尾有这些字符,则可能需要通过删除“\ b”来处理特殊情况。