Java 正则表达式支持 Unicode 吗?

95
为了将A到Z匹配,我们将使用正则表达式:

[A-Za-z]

如何让正则表达式匹配用户输入的UTF8字符?例如像"环保部"这样的中文单词。

2
在Java 7中,使用UNICODE_CHARACTER_CLASS标志或可嵌入的(?U)来支持Unicode正则表达式。请参见https://dev59.com/pW855IYBdhLWcg3wfUjQ - Alastair McCormack
5个回答

142
你需要寻找的是Unicode属性。
例如,\p{L} 表示来自任何语言的任何类型的字母。
因此,用于匹配中文单词的正则表达式可能类似于:
\p{L}+

有许多这样的属性,更多详情请参见regular-expressions.info

另一个选择是使用修饰符

Pattern.UNICODE_CHARACTER_CLASS

在Java 7中有一个新属性Pattern.UNICODE_CHARACTER_CLASS,它启用了预定义字符类的Unicode版本。 在这里查看我的答案以获取更多细节和链接

你可以像这样做:

Pattern p = Pattern.compile("\\w+", Pattern.UNICODE_CHARACTER_CLASS);

\w 还可以匹配来自任何语言的所有字母和数字(当然还包括一些单词组合字符,比如 _)。


为了匹配像Da̱nx̱a̱laga̱litła̱n这样的单词,我们需要指示模式匹配器组合变音符号吗? - Dave Jarvis
真是让人沮丧的是Pattern的javadoc没有明确说明"\P{L}是任何字母"。相反,您必须仔细阅读它们的示例 "[\p{L}&&[^\p{Lu}]]"才能看到它介绍了另一个在页面其他地方都没有提到的预定义类。 - Christopher Schultz

16

为了解决NLS支持和避免接受英文特殊字符,我们可以使用以下模式...

[a-zA-Z0-9 \u0080-\u9fff]*+

UTF代码点参考:http://www.utf8-chartable.de/unicode-utf8-table.pl

代码片段:

    String vowels = "అఆఇఈఉఊఋఌఎఏఐఒఓఔౠౡ";
    String consonants = "కఖగఘఙచఛజఝఞటఠడఢణతథదధనపఫబభమయరఱలళవశషసహ";
    String signsAndPunctuations = "కఁకంకఃకాకికీకుకూకృకౄకెకేకైకొకోకౌక్కౕకౖ";
    String symbolsAndNumerals = "౦౧౨౩౪౫౬౭౮౯";
    String engChinesStr = "ABC導字會";


    Pattern ALPHANUMERIC_AND_SPACE_PATTERN_TELUGU = Pattern
            .compile("[a-zA-Z0-9 \\u0c00-\\u0c7f]*+");
    System.out.println(ALPHANUMERIC_AND_SPACE_PATTERN_TELUGU.matcher(vowels)
            .matches());


    Pattern ALPHANUMERIC_AND_SPACE_PATTERN_CHINESE = Pattern
            .compile("[a-zA-Z0-9 \\u4e00-\\u9fff]*+");

    Pattern ENGLISH_ALPHANUMERIC_SPACE_AND_NLS_PATTERN = Pattern
            .compile("[a-zA-Z0-9 \\u0080-\\u9fff]*+");

    System.out.println(ENGLISH_ALPHANUMERIC_SPACE_AND_NLS_PATTERN.matcher(engChinesStr)
            .matches());

9

要匹配单个字符,您可以将它们作为文字或使用\u03FB语法将它们包含在字符类中。

显然,在表意文字中,您通常无法列出所有允许的字符。为了使正则表达式根据其类型或代码块处理unicode字符,支持各种其他转义字符,这些转义字符在此处定义。请查看“Unicode支持”部分,特别是对Character类和Unicode标准本身的引用。


如何匹配用户输入的多个UTF8字符,例如“环保部”,因为用户将随机输入数量的字符。 - cometta
1
这就像匹配多个拉丁字符一样:[a-z]+[a-z]{3},甚至是 [a-z]{2,10}。唯一不同的是您允许量词应用于的字符类中的内容。 - Kilian Foth

4
  • Java正则表达式API适用于char类型。
  • char类型隐式为UTF-16。
  • 如果您有UTF-8数据,且输入时未进行转码,则需要将其转码为UTF-16。

Unicode是字符的通用集合,UTF-8可以描述其中所有内容(包括控制字符、标点符号、符号、字母等)。您需要更具体地说明要包含什么和要排除什么。Java正则表达式使用\p{category}语法通过category匹配码点。请参阅Unicode标准获取类别列表

如果您想在一组汉字序列中识别和分离单词,您需要查看更复杂的API。我建议从 BreakIterator 类型开始。


0

从Java 9开始,您还可以使用\X来匹配任何Unicode扩展字形群集。请参见Java Doc: Pattern了解更多信息。


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