刚才有同事问,顺便发出来记一下。
以前读《精通正则表达式》的时候已经知道Java的正则表达式支持\p{In[i]name[/i]}的形式来指定匹配属于name的Unicode区块的字符。JDK的[url=http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html]Pattern类的文档[/url]上也有相关例子,\p{InGreek},表示匹配一个属于名为“Greek”的Unicode区块的字符。
那汉字怎么办?
Unicode里中文、日文与韩文的汉字是放在同一个(一些)区块里的,主要是在“CJK Unified Ideographs”当中,还有一些在“CJK Unified Ideographs Extension A”与“CJK Unified Ideographs Extension B”当中。
以前我没用这个方式匹配过汉字,还在想这名字里面有空格怎么办,试了一下\p{InCJK Unified Ideographs}发觉果然可以……当然,这种办法是不区分匹配到的汉字到底是中文、日文还是韩文的。也不区分简繁体。同事还问怎么用正则表达式只匹配简体中文,这个我就没想出什么好办法。
《精通正则表达式》里也提到.NET用的Unicode区块语法是\p{name}或者\p{Is[i]name[/i]},相关文档在[url=http://msdn.microsoft.com/en-us/library/az24scfc.aspx]这里[/url]。
放一demo代码:
以前读《精通正则表达式》的时候已经知道Java的正则表达式支持\p{In[i]name[/i]}的形式来指定匹配属于name的Unicode区块的字符。JDK的[url=http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html]Pattern类的文档[/url]上也有相关例子,\p{InGreek},表示匹配一个属于名为“Greek”的Unicode区块的字符。
那汉字怎么办?
Unicode里中文、日文与韩文的汉字是放在同一个(一些)区块里的,主要是在“CJK Unified Ideographs”当中,还有一些在“CJK Unified Ideographs Extension A”与“CJK Unified Ideographs Extension B”当中。
以前我没用这个方式匹配过汉字,还在想这名字里面有空格怎么办,试了一下\p{InCJK Unified Ideographs}发觉果然可以……当然,这种办法是不区分匹配到的汉字到底是中文、日文还是韩文的。也不区分简繁体。同事还问怎么用正则表达式只匹配简体中文,这个我就没想出什么好办法。
《精通正则表达式》里也提到.NET用的Unicode区块语法是\p{name}或者\p{Is[i]name[/i]},相关文档在[url=http://msdn.microsoft.com/en-us/library/az24scfc.aspx]这里[/url]。
放一demo代码:
public class TestUnicodeBlock {
public static void main(String[] args) {
final String regex = "\\p{InCJK Unified Ideographs}";
final String[] testChars = {
"\u6211", // a Chinese character
"\u300A", // a full-width punctuation
"\u3042", // a Hiragana character
"\uD55C" // a Hangul character
};
for (String s : testChars) {
System.out.printf("matched %s: %b\n", s, s.matches(regex));
}
}
}