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

3

我在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("こんにちは、元気ですか");

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

现在它总是返回false。通过一些调试,发现问题出在一个字符“、”上。如果将该字符作为正则表达式的一部分添加,则可以正常工作。

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

1个回答

3
事实上, (U+3001 IDEOGRAPHIC COMMA) 属于Unicode类别中的 "Punctuation, other",而 \\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字符类匹配标点符号和符号)。

请参见Java演示,输出结果为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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接