如何让正则表达式匹配用户输入的UTF8字符?例如像"环保部"这样的中文单词。[A-Za-z]
\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
还可以匹配来自任何语言的所有字母和数字(当然还包括一些单词组合字符,比如 _
)。
Pattern
的javadoc没有明确说明"\P{L}
是任何字母"。相反,您必须仔细阅读它们的示例 "[\p{L}&&[^\p{Lu}]]
"才能看到它介绍了另一个在页面其他地方都没有提到的预定义类。 - Christopher Schultz为了解决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标准本身的引用。
[a-z]+
或 [a-z]{3}
,甚至是 [a-z]{2,10}
。唯一不同的是您允许量词应用于的字符类中的内容。 - Kilian Fothchar
类型。char
类型隐式为UTF-16。Unicode是字符的通用集合,UTF-8可以描述其中所有内容(包括控制字符、标点符号、符号、字母等)。您需要更具体地说明要包含什么和要排除什么。Java正则表达式使用\p{category}
语法通过category匹配码点。请参阅Unicode标准获取类别列表。
如果您想在一组汉字序列中识别和分离单词,您需要查看更复杂的API。我建议从 BreakIterator
类型开始。
UNICODE_CHARACTER_CLASS
标志或可嵌入的(?U)
来支持Unicode正则表达式。请参见https://dev59.com/pW855IYBdhLWcg3wfUjQ - Alastair McCormack