检测全角和半角的空格:正则表达式 VS Character.isWhitespace()

我的任务是检测服务器应用程序的 csv 中是否存在任何字符串空格。CSV的内容是日语、英语、一些符号和数字的组合。英语中的空格是半角,日语中的空格是全角。两种语言中空格的宽度和字节大小不同。


我正在使用 Java 8 进行编码,最好不要使用第三方库。


我正在考虑两种方法,这些是伪代码。


正则表达式:


targetStr.matches("\\s+");

字符.isWhitespace():


targetStr.codepoints()

             .filter(c -> Character.isWhitespace(c))

             .count() > 0

上述伪代码中的任何一个都可以完成这项任务吗?


哪个对我的情况更有效?


跃然一笑
浏览 239回答 1
1回答

12345678_0001

首先,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()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java