日语字符串的模式匹配在 java 中存在问题

Pattern matching for Japanese string have issues in java

我在 Java 中仅匹配日语字符时遇到一个奇怪的问题。 让我用代码来解释。

private static final Pattern ADDRESS_STRING_PATTERN =
        Pattern.compile("^[\p{L}\d\s\p{Punct}]{1,200}$");
private static boolean isValidInput(final String input, Pattern pattern) {
    return pattern.matcher(input).matches();
}
System.out.println("こんにちは、元気ですか");

我在这里匹配任何字母,Space,数字或标点符号字母 1 到 200。

现在这将始终 return 错误。经过一番调试发现问题出在一个字符“、”上。如果我将该字符添加为正则表达式的一部分,它就可以正常工作。

有人遇到过这个问题吗?或者是 Java 中的错误?

问题是 (U+3001 IDEOGRAPHIC COMMA) belongs to "Punctuation, other" Unicode category\p{Punct} 默认只匹配 ASCII 标点符号。如果您使用 Pattern.UNICODE_CHARACTER_CLASS 选项或 (?U) 嵌入标志选项,它将匹配(即模式可能看起来像 "(?U)^[\p{L}\d\s\p{Punct}]{1,200}$")。但是,这可能会影响 \d\s,而且我不确定您是否要匹配所有 Unicode 数字和空格。

另一种方法是使用 \p{P}\p{S}(匹配 Unicode 标点符号)而不是 \p{Punct}(POSIX 字符 class 匹配标点符号和符号)。

看到 Java demo 打印 true:

private static final Pattern ADDRESS_STRING_PATTERN = Pattern.compile("^[\p{L}\d\s\p{P}\p{S}]{1,200}$");
private static boolean isValidInput(final String input, Pattern pattern) {
        return pattern.matcher(input).matches();
}
public static void main (String[] args) throws java.lang.Exception
{
    System.out.println(isValidInput("こんにちは、元気ですか",ADDRESS_STRING_PATTERN));
}
// => true