Java 检测全宽和半宽的空白:regex VS Character.isWhitespace()

Java 检测全宽和半宽的空白:regex VS Character.isWhitespace(),java,regex,string,java-8,Java,Regex,String,Java 8,我的任务是检测服务器应用程序的csv中是否存在任何字符串空白。CSV的内容将是日语、英语、一些符号和数字的组合。 英语中的空格为半宽,日语中的空格为全宽。两种语言中空格的宽度和字节大小不同 我用Java8编码,最好不要使用第三方库 我正在考虑两种方法,它们是伪代码 正则表达式: targetStr.matches("\\s+"); Character.isWhitespace: targetStr.codepoints() .filter(c -> Charac

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

我用Java8编码,最好不要使用第三方库

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

正则表达式:

targetStr.matches("\\s+");
Character.isWhitespace:

targetStr.codepoints()
             .filter(c -> Character.isWhitespace(c))
             .count() > 0
上述伪代码中的任何一个都可以执行此任务吗

对于我的情况,哪一种更有效?

首先,targetStr.matches\\s+和targetStr.codepoints.filterc->Character.isWhitespacec.count>0具有完全不同的逻辑

String.matches需要匹配整个字符串,因此使用\s+时,它必须完全由空白组成。相反,如果您至少有一个空格字符,则count>0是令人满意的,因此它是targetStr.codepoints.anyMatchCharacter::isWhitespace的低效且冗长的版本

如果要检查所有字符是否都是空白,则应改用allMatch

但是,另外,对于空白空间有不同的定义

:

确定指定的字符Unicode代码点是否为 根据Java,空白区域。一个字符是Java 空格字符当且仅当它满足 以下标准: 它是一个Unicode空格字符空格分隔符, 行分隔符或段落分隔符 但也不是一个不间断的空格“\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是一个空白字符:[\t\n\x0B\f\r]

所以有一个显著的区别

如中所述,您可以使\s与所有空白字符匹配,或者首先使用与所有unicode空白字符匹配的模式。或者显式引用与Character.isWhitespace相同的逻辑,但不完全相同:

如果要严格应用Character.isWhitespace的逻辑,可以使用

匹配所有字符 string.codePoints.allMatchCharacter::isWhitespace string.matches\\p{javaWhitespace}+ string.isBlank JDK11 当至少有一个空白字符时匹配 string.codePoints.anyMatchCharacter::isWhitespace string.matches.*\\p{javaWhitespace}* Pattern.compile\\p{javaWhitespace}.matcherstring.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}.matcherstring.find Pattern.compile\\s,Pattern.UNICODE\u CHARACTER\u CLASS.matcherstring.find
你现在的问题陈述是什么?你说的全宽和半宽是什么意思?请通过以下方式发布一个最小且可重复的示例:您可以减少targetStr.codePoints.anyMatchCharacter::isWhitespace的第二种方法。它可能比正则表达式快,但除非每秒执行数百次,否则不太可能注意到差异。是否要删除这些空白?实际上,我正在尝试检测字符串中是否有空格。