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