Java正则表达式的特殊字符

时间:2015-12-04 12:37:19

标签: java regex

我有从文本中提取#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Č”。

测试: INPUT:

#Orange in Czech language mean #pomeranč :-)

输出:

[#Orange]

但它是FAIL,输出必须是[#Orange, #pomeranč]。你能告诉我,错误的代码在哪里?帮我。谢谢。

2 个答案:

答案 0 :(得分:5)

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

  

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

以下是a demo

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()));

输出:[#Orange, #pomeranč]

答案 1 :(得分:1)

使用否定字符类

/#[^ ]+/
  • [^ ]+否定字符类,匹配空格以外的任何内容,实际上匹配字符直到下一个空格

Regex Demo