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()
添加回答
舉報