日语字符串的模式匹配在 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
我在 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