检查字符串是否包含非拉丁字母

Check that string contains non-latin letters

我有以下方法来检查字符串是否仅包含拉丁符号。

private boolean containsNonLatin(String val) {
        return val.matches("\w+");
}

但是如果我传递字符串 return 是错误的:my string 因为它包含 space。 但是我需要一种方法来检查字符串是否包含不在拉丁字母表中的字母,它应该 return false 并且在所有其他情况下它应该 return true。

请帮助改进我的方法。

有效字符串示例:

w123.
w, 12
w#123
dsf%&@

您可以使用 \p{IsLatin} class:

return !(var.matches("[\p{Punct}\p{Space}\p{IsLatin}]+$"));

Java Regex Reference

只需将 space 添加到您的匹配器:

private boolean isLatin(String val) {
    return val.matches("[ \w]+");
}

用户这个:

public static boolean isNoAlphaNumeric(String s) {
       return s.matches("[\p{L}\s]+");
}
  • \p{L} 表示任何 Unicode 字母。
  • \sspace字符

I need something like not p{IsLatin}

如果需要匹配除拉丁ASCII字母以外的所有字母,可以使用

"[\p{L}\p{M}&&[^\p{Alpha}]]+"

\p{Alpha}POSIXclass匹配[A-Za-z]\p{L} 匹配任何 Unicode 基本字母,\p{M} 匹配变音符号。当我们添加 &&[^\p{Alpha}] 时,我们从所有 Unicode 字母中减去这些 [A-Za-z]

整个表达式表示匹配一个或多个非ASCII字母的Unicode字母

要添加 space,只需添加 \s:

"[\s\p{L}\p{M}&&[^\p{Alpha}]]+"

IDEONE demo:

List<String> strs = Arrays.asList("w123.", "w, 12", "w#123", "dsf%&@", "Двв");
for (String str : strs)
    System.out.println(!str.matches("[\s\p{L}\p{M}&&[^\p{Alpha}]]+")); // => 4 true, 1 false