我正在尝试匹配字符串文本中的某些关键字。关键字可以包含特殊字符的任意组合,并且必须是整个单词(没有空格)。
public static void main(String[] args)
{
String words[] = {"Hello", "World", "£999.00", "*&332", "$30,00", "$1230.30",
"Apple^*$Banana&$Pears!$", "90.09%"};
String text = "Hello world World £99900 £999.00 Apple^*$Banana&$Pears!$"
+ " $30,00 *&332 $1230.30 90.09%";
StringBuilder regex = new StringBuilder();
regex.append("(");
for(String item : word)
regex.append("(?:^|\\s)").append(item).append("(?:$|\\s)").append("|");
regex.deleteCharAt(buildRegex.length() - 1);
regex.append(")");
Pattern pattern = Pattern.compile(regex.toString());
Matcher match = pattern.matcher(text);
while (match.find())
System.out.println(match.group());
}
我得到的结果是:
的你好
世界
£999.00
&安培; 332
90.09%
并非所有单词都匹配。我已尝试在此处发布不同的解决方案,搜索和非匹配可以匹配我的示例中的所有单词。
如何匹配包含特殊字符组合的关键字?
答案 0 :(得分:1)
这个基于lookaround
的正则表达式应该可以工作:
for(String item : words)
regex.append("(?<=^|\\s)").append(Pattern.quote(item)).append("(?=\\s|$)").append("|");
主要区别是:
Pattern.quote
来处理特殊字符这会得到输出:
Hello
World
£999.00
Apple^*$Banana&$Pears!$
$30,00
*&332
$1230.30
90.09%
答案 1 :(得分:0)
使用Pattern.quote()
。更重要的是,你需要使用lookbehind和lookahead:
for(String item : word)
regex.append("(?<=^|\\s)")
.append(Pattern.quote(item)) // HERE
.append("(?=$|\\s)").append("|");
基本上,此方法的作用是预先\Q
并将\E
附加到字符串。请参阅Pattern
的javadoc。