【问题标题】:Detecting whitespaces of fullwidth and halfwidth: regex VS Character.isWhitespace()检测全角和半角的空格:regex VS Character.isWhitespace()
【发布时间】:2019-09-18 15:18:19
【问题描述】:

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

我使用 Java 8 进行编码,最好不要使用 3rd 方库。

我正在考虑两种方法,它们是伪代码。

正则表达式:

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

Character.isWhitespace():

targetStr.codepoints()
             .filter(c -> Character.isWhitespace(c))
             .count() > 0

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

哪种方法更适合我的情况?

【问题讨论】:

  • 您现在的问题陈述是什么?全宽和半宽是什么意思?请按照以下方式发布一个最小且可重现的示例:stackoverflow.com/help/minimal-reproducible-example
  • 您可以将第二种方法简化为targetStr.codePoints().anyMatch(Character::isWhitespace)。它可能比正则表达式快,但除非您每秒执行数百次,否则您不太可能注意到差异。
  • 您要删除这些空格吗?
  • 其实我是在尝试检测字符串中是否有空格。

标签: java regex string java-8


【解决方案1】:

首先,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:

确定指定字符(Unicode 代码点)是否为 根据Java的空白。一个字符就是一个Java 空白字符当且仅当它满足 以下标准:

  • 它是一个 Unicode 空格字符 (SPACE_SEPARATOR, LINE_SEPARATOR,或PARAGRAPH_SEPARATOR) 但也不是一个不间断的空间 ('\u00A0', '\u2007''\u202F')。
  • '\t',U+0009 水平制表。
  • '\n',U+000A LINE FEED。
  • 它是'\u000B',U+000B 垂直制表。
  • 它是'\f',U+000C 换页。
  • '\r',U+000D 回车。
  • 它是'\u001C',U+001C 文件分隔符。
  • 它是'\u001D',U+001D 组分隔符。
  • 它是'\u001E',U+001E 记录分隔符。
  • '\u001F',U+001F 单位分隔符。

the \s pattern(默认):

\s空格字符:[ \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 文档的第一个项目符号所述,它将为不间断空格字符('\u00A0''\u2007''\u202F')返回false,尽管它们具有空白 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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    • 2019-11-30
    • 2015-05-18
    • 1970-01-01
    • 2012-11-13
    • 2014-08-07
    相关资源
    最近更新 更多