为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

跃然一笑 2023-08-09 16:55:57
我的任务是检测服务器应用程序的 csv 中是否存在任何字符串空格。CSV的内容是日语、英语、一些符号和数字的组合。英语中的空格是半角,日语中的空格是全角。两种语言中空格的宽度和字节大小不同。我正在使用 Java 8 进行编码,最好不要使用第三方库。我正在考虑两种方法,这些是伪代码。正则表达式:targetStr.matches("\\s+");字符.isWhitespace():targetStr.codepoints()             .filter(c -> Character.isWhitespace(c))             .count() > 0上述伪代码中的任何一个都可以完成这项任务吗?哪个对我的情况更有效?
查看完整描述

1 回答

?
12345678_0001

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_SEPARATORPARAGRAPH_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()


查看完整回答
反对 回复 2023-08-09
  • 1 回答
  • 0 关注
  • 238 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信