有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

日语字符串的正则表达式模式匹配在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("こんにちは、元気ですか");

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

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

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


共 (1) 个答案

  1. # 1 楼答案

    问题是^{} (^{}) 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