java - 在 Java 中使用正则表达式模式检测非拉丁字符
问题描述
我认为拉丁字符是我在问题中的意思,但我不完全确定正确的分类是什么。我正在尝试使用正则表达式模式来测试字符串是否包含非拉丁字符。我期待以下结果
"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");
解决方案
TL;DR:使用正则表达式^[\p{Print}\p{IsLatin}]*$
如果字符串包含以下内容,您需要一个匹配的正则表达式:
- 空间
- 数字
- 标点
- 拉丁字符(Unicode 脚本“Latin”)
最简单的方法是与 结合\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}
,但这很好,因为字符类消除了重复项。
所以,正则表达式是:^[\p{Print}\p{IsLatin}]*$
测试
Pattern latinPattern = Pattern.compile("^[\\p{Print}\\p{IsLatin}]*$");
String[] inputs = { "abcDE 123", "!@#$%^&*", "aaàààäää", "ベビードラ", "" };
for (String input : inputs) {
System.out.print("\"" + input + "\": ");
Matcher matcher = latinPattern.matcher(input);
if (! matcher.find()) {
System.out.println("is NON latin");
} else {
System.out.println("is latin");
}
}
输出
"abcDE 123": is latin
"!@#$%^&*": is latin
"aaàààäää": is latin
"ベビードラ": is NON latin
"": is NON latin
推荐阅读
- git - 为什么某些提交在 GITLAB.COM 中不正确?
- android - 为什么我在 Andoird 应用程序中看到的是空白屏幕而不是我的片段?
- c# - 使用 IronPdf 与 .pdf 文件交互会导致内部 CLR 错误 (0x80131506)
- sybase - Sybase - 删除所有表,排除
- javascript - 当我增加屏幕尺寸时,如何阻止我的徽标向右浮动?
- javascript - 乔伊 | 打印的验证错误消息带有意外字符
- javascript - 如何使用 Webpack 将 Javascript 和 CSS 文件捆绑到特定文件夹?
- c - 带有 /proc 文件系统的 AIX 上的终端信息
- python - 在 PyTorch 中设置随机权重平均的学习率
- r - ggplot2:使用用户提供的 x 轴限制的自动 y 限制