regex Java正则表达式是否支持Unicode?

nwsw7zdq  于 2023-01-18  发布在  Java
关注(0)|答案(5)|浏览(148)

为了匹配A和Z,我们将使用regex:
[阿-扎-兹]
How to allow regex to match utf8 characters entered by user? For example Chinese words like 环保部

unhi4e5o

unhi4e5o1#

您要查找的是Unicode属性。
例如,\p{L}是任何语言的任何类型的字母
所以匹配这样一个中文单词的正则表达式可能类似于

\p{L}+

此类属性有很多,有关详细信息,请访问regular-expressions.info
另一种选择是使用修饰符
Pattern.UNICODE_CHARACTER_CLASS
在Java 7中,有一个新属性Pattern.UNICODE_CHARACTER_CLASS,用于启用Unicode版本的预定义字符类see my answer here for some more details and links
你可以做这样的事

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

\w将匹配任何语言的所有字母和所有数字(当然还有一些单词组合字符,如_)。

hpxqektj

hpxqektj2#

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

[a-zA-Z0-9]*+

对于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());
zrfyljdw

zrfyljdw3#

要匹配单个字符,可以简单地将它们作为文字或通过\u03FB语法包含在字符类中。
显然,您通常无法列出表意语言中所有允许的字符。为了使正则表达式根据Unicode字符的类型或代码块来处理它们,支持定义为here的各种其他转义。请查看“Unicode支持”一节,特别是对Character类和Unicode标准本身的引用。

nhaq1z21

nhaq1z214#

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

Unicode是通用字符集,UTF-8可以描述所有字符(包括控制字符、标点符号、符号、字母等)。您必须更具体地说明要包含和排除的内容。Java正则表达式使用\p{category}语法通过category匹配代码点。有关list的类别,请参阅Unicode standard
如果你想识别和分隔一系列表意文字中的单词,你需要看一个更复杂的API,我会从BreakIterator类型开始。

vom3gejh

vom3gejh5#

从Java9开始,你也可以使用\X来匹配任何Unicode扩展的字素簇。

相关问题