如何将图案与支架内部相匹配?

时间:2011-02-27 09:48:44

标签: java regex escaping

我正在尝试在大文字中查找特定短语,但该短语可能包含“[”,“(”,“*”,...,如“name1(name2”)等字符,但在查找时会导致无效的异常。这是我的代码:

Pattern myPattern = Pattern.compile( "\\b" + phrase + "\\b" );  // Exception
Matcher myMatcher = myPattern.matcher( largeText );

我曾尝试使用quote(...)来修复此类字符,但它不起作用:

phrase = Pattern.quote( phrase );

如何修复此问题以允许此类字符?

4 个答案:

答案 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”来处理特殊情况。