1 回答
TA貢獻1802條經驗 獲得超5個贊
首先,targetStr.matches("\\s+")并targetStr.codepoints().filter(c -> Character.isWhitespace(c)).count() > 0承擔完全不同的邏輯。
String.matches要求整個字符串匹配,因此\s+它必須完全由空格組成。相反,count() > 0如果您至少有一個空白字符,則滿足,因此它是 的一種低效且冗長的版本targetStr.codepoints().anyMatch(Character::isWhitespace)。
如果你想檢查所有字符是否都是空格,你應該使用allMatch。
但進一步來說,空白有不同的定義
Character.isWhitespace:
根據 Java 確定指定字符(Unicode 代碼點)是否為空格。當且僅當一個字符滿足以下條件之一時,它才是 Java 空白字符:
它是 Unicode 空格字符(
SPACE_SEPARATOR、?LINE_SEPARATOR或PARAGRAPH_SEPARATOR),但也不是不間斷空格('\u00A0'、?'\u2007'、'\u202F')。它是
'\t',U+0009 水平制表。它是
'\n',U+000A 換行符。它是
'\u000B',U+000B 垂直制表。它是
'\f',U+000C 換頁。它是
'\r',U+000D 回車。它是
'\u001C',U+001C 文件分隔符。它是
'\u001D',U+001D 組分隔符。它是
'\u001E',U+001E 記錄分隔符。它是
'\u001F',U+001F 單位分隔符。
模式\s(默認):
\s?空白字符:[ \t\n\x0B\f\r]
所以這是有顯著差異的。
您可以\s匹配所有空白字符,或者使用首先匹配所有 unicode 空白字符的模式?;蛘唢@式地引用相同的邏輯Character.isWhitespace,這并不完全相同:
如果你想嚴格應用 的邏輯Character.isWhitespace,你可以使用
匹配所有字符
string.codePoints().allMatch(Character::isWhitespace)string.matches("\\p{javaWhitespace}+")string.isBlank()(JDK11)
當至少有一個空白字符 時進行匹配
string.codePoints().anyMatch(Character::isWhitespace)string.matches(".*\\p{javaWhitespace}.*")Pattern.compile("\\p{javaWhitespace}").matcher(string).find()
正如文檔的第一個項目符號所述Character.isWhitespace,它將返回false不間斷空格字符 (?'\u00A0',?'\u2007',?'\u202F'),盡管它們具有空白 Unicode 屬性。如果你想將它們匹配為空白,你可以使用
匹配所有字符
string.matches("(?U)\\s+")string.matches("\\p{IsWhiteSpace}+")
當至少有一個空白字符 時進行匹配
string.matches("(?U).*\\s.*")string.matches(".*\\p{IsWhiteSpace}.*")Pattern.compile("\\p{IsWhitespace}").matcher(string).find()Pattern.compile("\\s", Pattern.UNICODE_CHARACTER_CLASS).matcher(string).find()
添加回答
舉報
