Java Regex模式匹配来自所有以空格结尾的语言的String

时间:2015-11-22 13:51:40

标签: java regex

基本上,我需要匹配以字符串中的字符开头的单词。以下是一个例子:

I am trying to match #this_word but ignore the rest.

我还需要正则表达式来匹配来自不同语言的字符。我试过这个:

#\\s*(\\w+)

但是错误,它只包含英文单词。

当我尝试正则表达式如下所示:

#(?>\\p{L}\\p{M}*+)+

我得到outofboundsexception

修改

显然我之前得到错误的原因是因为我写道:

 matcher.group(1);

而不是:

 matcher.group(0);

3 个答案:

答案 0 :(得分:2)

如果您不关心数字,只需在模式前添加(?U) flag

  

<强> UNICODE_CHARACTER_CLASS
  public static final int UNICODE_CHARACTER_CLASS

  启用Unicode版本的预定义字符类 POSIX字符类

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

     

也可以通过嵌入式标志表达式UNICODE_CHARACTER_CLASS启用(?U)模式。

     

该标志意味着UNICODE_CASE,也就是说,它启用了Unicode感知的案例折叠。

正则表达式:

Pattern ptrn = Pattern.compile("(?U)#\\w+");

请参阅IDEONE demo

您实际上可以使用\w[\\w&&[^\\d]]中减去数字,只匹配下划线和Unicode字母:

Pattern ptrn = Pattern.compile("#[\\w&&[^\\d]]+", Pattern.UNICODE_CHARACTER_CLASS);

Another demo

作为替代方案,要匹配任何Unicode字母,您可以使用\p{L}\p{M}*+子模式(\p{L}是基本字母,\p{M}匹配变音符号)。因此,要仅匹配#之后的字母,您可以使用#(?>\p{L}\p{M}*+)+

要同时支持匹配下划线,请将其添加为替代:#(?>\p{L}\p{M}*+|_)+

如果您不关心变音符号的位置,请仅使用字符类:#[\p{L}\p{M}_]+

请参阅此IDEONE demo

String str = "I am trying to match #эту_строку but ignore the rest.";
Pattern ptrn = Pattern.compile("#(?>\\p{L}\\p{M}*+|_)+");
Matcher matcher = ptrn.matcher(str);
while (matcher.find()) {
    System.out.println(matcher.group(0));
}

答案 1 :(得分:0)

您可以使用以下代码捕获所有Unicode字母(由\p{L}类匹配):

String ss="I am trying to match #this_word but ignore the rest.";
        Matcher m =Pattern.compile("#(\\p{L})+",Pattern.CASE_INSENSITIVE).matcher(ss);
        while (m.find()) {            
            System.out.println(m.group());
        }

答案 2 :(得分:0)

使用此模式:

 #[^\s]+

这可能有用。它将匹配给定String中的每个非间隔字符..