首页 > 解决方案 > 在 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");

标签: javaregexlatin

解决方案


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àààäää", "ベビードラ&quot;, "" };
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
"ベビードラ&quot;: is NON latin
"": is NON latin

推荐阅读