Java 正则表达式用于支持 Unicode



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

[A-Za-z]

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

您要查找的是 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将匹配任何语言的所有字母和所有数字(当然还有一些组合字符的单词,如_)。

为了解决 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());

若要匹配单个字符,只需将它们作为文字或通过u03FB语法包含在字符类中即可。

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

  • Java 正则表达式 API 适用于char类型
  • char类型隐式为 UTF-16
  • 如果您有 UTF-8 数据,则需要在输入时将其转码为 UTF-16(如果尚未这样做)

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

如果要识别和分隔表意文字序列中的单词,则需要查看更复杂的API。我会从BreakIterator类型开始。

从 Java 9 开始,您还可以使用 X 来匹配任何 Unicode 扩展字素簇。更多信息请参阅Java Doc:Pattern。

最新更新