我的任务是检测服务器应用程序的csv中是否有任何空格字符串。CSV的内容是日语、英语、一些符号和数字的组合。英语中的白空间是半宽的,日语的是全宽的。两种语言中空白的宽度和字节大小是不同的。
我使用Java 8编写代码,不使用第三方库更好。
我正在考虑两种方法,这些都是伪码。
Regex:
targetStr.matches("\\s+");Character.isWhitespace():
targetStr.codepoints()
.filter(c -> Character.isWhitespace(c))
.count() > 0上面的任何一个伪码会执行这个任务吗?
哪一个对我的案子更有效?
发布于 2019-09-18 17:41:30
首先,targetStr.matches("\\s+")和targetStr.codepoints().filter(c -> Character.isWhitespace(c)).count() > 0的逻辑完全不同。
String.matches需要整个字符串才能匹配,所以对于\s+,它必须完全由空格组成。相反,如果您至少有一个空白字符,count() > 0就会感到满意,因此它是一个效率低下且冗长的targetStr.codepoints().anyMatch(Character::isWhitespace)版本。
如果您想检查是否所有字符都是空格,则应该使用allMatch .
但是,对于空白有不同的定义。
根据Java确定指定字符(Unicode代码点)是否为空白。一个字符是一个Java空格字符当且仅当它满足以下条件之一:
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单元分离器。the \s pattern (默认情况下):
\sa空格字符:[ \t\n\x0B\f\r]
所以这两者有很大的区别。
正如在this answer中解释的那样,您可以使\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文档的第一个符号所述,尽管它们具有空格Unicode属性,但它将返回非中断空间字符('\u00A0'、'\u2007'、'\u202F')的false。如果要将它们匹配为空白,可以使用
匹配所有字符
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()时匹配
https://stackoverflow.com/questions/57996089
复制相似问题