簡體   English   中英

日語字符串的模式匹配在java中存在問題

[英]Pattern matching for Japanese string have issues in java

我有一個奇怪的問題,而模式只匹配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中的這個錯誤?

問題是U+3001 IDEOGRAPHIC COMMA )屬於“標點符號,其他”Unicode類別\\\\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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM