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()
添加回答
举报