Java 检测全宽和半宽的空白:regex VS Character.isWhitespace()
我的任务是检测服务器应用程序的csv中是否存在任何字符串空白。CSV的内容将是日语、英语、一些符号和数字的组合。 英语中的空格为半宽,日语中的空格为全宽。两种语言中空格的宽度和字节大小不同 我用Java8编码,最好不要使用第三方库 我正在考虑两种方法,它们是伪代码 正则表达式: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
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的第二种方法。它可能比正则表达式快,但除非每秒执行数百次,否则不太可能注意到差异。是否要删除这些空白?实际上,我正在尝试检测字符串中是否有空格。