我认为拉丁字符是我的问题,但我不完全确定什么是正确的分类。我尝试使用正则表达式模式来测试字符串是否包含非拉丁字符。我期待以下结果
"abcDE 123"; // Yes, this should match
"!@#$%^&*"; // Yes, this should match
"aaàààäää"; // Yes, this should match
"ベビードラ"; // No, this shouldn't match
"????"; // No, this shouldn't match
我的理解是 {IsLatin}
预设只是检测是否有任何字符是拉丁语。我想检测是否有任何字符不是拉丁语。
Pattern LatinPattern = Pattern.compile("\\p{IsLatin}");
Matcher matcher = LatinPattern.matcher(str);
if (!matcher.find()) {
System.out.println("is NON latin");
return;
}
System.out.println("is latin");
2条答案
按热度按时间jexiocij1#
热释光;dr:使用正则表达式
^[\p{Print}\p{IsLatin}]*$
如果字符串包含以下内容,则需要匹配的正则表达式:空间
数字
标点符号
拉丁字符(unicode脚本“拉丁”)
最简单的方法是合并
\p{IsLatin}
与\p{Print}
,在哪里Pattern
定义\p{Print}
作为:\p{Print}
-可打印字符:[\p{Graph}\x20]
\p{Graph}
-可见字符:[\p{Alnum}\p{Punct}]
\p{Alnum}
-字母数字字符:[\p{Alpha}\p{Digit}]
\p{Alpha}
-字母字符:[\p{Lower}\p{Upper}]
\p{Lower}
-小写字母:[a-z]
\p{Upper}
-大写字母字符:[A-Z]
\p{Digit}
-十进制数字:[0-9]
\p{Punct}
-标点符号:一种!"#$%&'()*+,-./:;<=>?@[]^_
{|}~
\x20` -空间:这使得
\p{Print}
一样[\p{ASCII}&&\P{Cntrl}]
,即不是控制字符的ascii字符。这个
\p{Alpha}
零件与重叠\p{IsLatin}
,但这很好,因为character类消除了重复项。所以,正则表达式是:
^[\p{Print}\p{IsLatin}]*$
测试输出
n3schb8v2#
所有拉丁unicode字符类都是:
所以,答案是
注意,在java中,下划线是从unicode属性类名中删除的。
请参见java演示:
注:如果更换
.find()
与.matches()
,你可以扔掉^
以及$
在模式中。输出: