Java正则表达式:特殊字符

3

我有一种简单的方法可以从文本中提取#hashTag:

private String[] buildHashTag(String str) {
        ArrayList<String> allMatches = new ArrayList<String>();
        Matcher m = Pattern.compile("(#\\w+)\\b").matcher(str);
        while (m.find()) {
            allMatches.add(m.group());
        }
        return allMatches.toArray(new String[0]);
    }

问题在于如果我发送带有特殊字符的字符串,例如字符串“POMERANČ”。
测试: 输入:
#Orange in Czech language mean #pomeranč :-)

输出:

[#Orange]

但它失败了,输出必须是[#Orange, #pomeranč]。你能告诉我,哪里出了错吗?帮帮我。谢谢。


1
添加 Pattern.UNICODE_CHARACTER_CLASS 修饰符或使用 Pattern.compile("(?U)(#\\w+)\\b")。否则,\b/\w 将无法正常工作。 - Wiktor Stribiżew
@stribizhev 谢谢。它起作用了。 - cagounai
2个回答

5
添加 Pattern.UNICODE_CHARACTER_CLASS 修饰符或使用 Pattern.compile("(?U)(#\\w+)\\b")。否则,\b\w 不会匹配所有 Unicode 字符。
引用:

当指定了此标志时,则(仅限 US-ASCII)预定义字符类POSIX 字符类 符合 Unicode Technical Standard #18: Unicode Regular Expression 附录 C:兼容属性。

这里有演示
String str = "#Orange in Czech language mean #pomeranč :-)";
ArrayList<String> allMatches = new ArrayList<String>();
Matcher m = Pattern.compile("(?U)(#\\w+)\\b").matcher(str);
//                           ^^^^
while (m.find()) {
    allMatches.add(m.group());
}
System.out.println(Arrays.toString(allMatches.toArray()));

输出:[#橙色,#柑桔色]

它对你有效吗?我需要添加更多解释吗? - Wiktor Stribiżew

1
请使用否定字符类。
/#[^ ]+/
  • [^ ]+ 反向字符类,匹配除空格以外的任何字符,实际上会匹配到下一个空格为止

正则表达式演示


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接