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

时间:2018-01-24 21:31:54

标签: java regex cjk

我有一个奇怪的问题,而模式只匹配Java中的Japaneese字符。 让我用代码解释一下。

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 个答案:

答案 0 :(得分:3)

问题是 (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字符类匹配标点符号和符号)。

查看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