首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检测全宽度和半宽度的空白: regex对Character.isWhitespace()

检测全宽度和半宽度的空白: regex对Character.isWhitespace()
EN

Stack Overflow用户
提问于 2019-09-18 15:18:19
回答 1查看 2.6K关注 0票数 2

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

我使用Java 8编写代码,不使用第三方库更好。

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

Regex:

代码语言:javascript
复制
targetStr.matches("\\s+");

Character.isWhitespace():

代码语言:javascript
复制
targetStr.codepoints()
             .filter(c -> Character.isWhitespace(c))
             .count() > 0

上面的任何一个伪码会执行这个任务吗?

哪一个对我的案子更有效?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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 .

但是,对于空白有不同的定义。

Character.isWhitespace

根据Java确定指定字符(Unicode代码点)是否为空白。一个字符是一个Java空格字符当且仅当它满足以下条件之一:

  • 它是一个Unicode空间字符(SPACE_SEPARATORLINE_SEPARATORPARAGRAPH_SEPARATOR),但也不是一个不间断的空间('\u00A0''\u2007''\u202F')。
  • It是'\t',U+0009水平制表。
  • 这是'\n',U+000A行提要。
  • It是'\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 a空格字符:[ \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()

时匹配

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57996089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档