Java正则表达式 – 只有一个空格的表达式

我想将所有表达式与一个空格匹配。 目前,我正在使用[^\\s]*\\s[^\\s]* 。 但这似乎不是一个很好的方式。

为什么不? 这很好,只是有点过于复杂:

 \\S*\\s\\S* 

我想将所有表达式与一个空格匹配。

用于查找Java字符串中是否出现任何空格的正确模式是:

 \A[^\u0009\u000A-\u000D\u0020\u0085\u00A0\u1680\u180E\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]*+[\u0009\u000A-\u000D\u0020\u0085\u00A0\u1680\u180E\u2000-\u200A\u2028\u2029\u202F\u205F\u3000][\u0009\u000A-\u000D\u0020\u0085\u00A0\u1680\u180E\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]*+\z 

此处提供的其他答案未正确回答所提出的问题。

以下是所有Unicode空白字符,以及它们的年龄(含义,它们首次出现的Unicode版本)以及与间距问题相关的二进制属性。

 U+0009 CHARACTER TABULATION \s \h \pC \p{Cc} Age=1.1 HorizSpace Pattern_White_Space Space White_Space U+000A LINE FEED (LF) \s \v \R \pC \p{Cc} Age=1.1 Pattern_White_Space Space VertSpace White_Space U+000B LINE TABULATION \v \R \pC \p{Cc} Pattern_White_Space Space VertSpace White_Space U+000C FORM FEED (FF) \s \v \R \pC \p{Cc} Age=1.1 Pattern_White_Space Space VertSpace White_Space U+000D CARRIAGE RETURN (CR) \s \v \R \pC \p{Cc} Age=1.1 Pattern_White_Space Space VertSpace White_Space U+0020 SPACE \s \h \pZ \p{Zs} Age=1.1 HorizSpace Pattern_White_Space Space Space_Separator White_Space U+0085 NEXT LINE (NEL) \s \v \R \pC \p{Cc} Age=1.1 Pattern_White_Space Space VertSpace White_Space U+00A0 NO-BREAK SPACE \s \h \pZ \p{Zs} Age=1.1 HorizSpace Space Space_Separator White_Space U+1680 OGHAM SPACE MARK \s \h \pZ \p{Zs} Age=3.0 HorizSpace Space Space_Separator White_Space U+180E MONGOLIAN VOWEL SEPARATOR \s \h \pZ \p{Zs} Age=3.0 HorizSpace Space Space_Separator White_Space U+2000 EN QUAD \s \h \pZ \p{Zs} Age=1.1 HorizSpace Space Space_Separator White_Space U+2001 EM QUAD \s \h \pZ \p{Zs} Age=1.1 HorizSpace Space Space_Separator White_Space U+2002 EN SPACE \s \h \pZ \p{Zs} Age=1.1 HorizSpace Space Space_Separator White_Space U+2003 EM SPACE \s \h \pZ \p{Zs} Age=1.1 HorizSpace Space Space_Separator White_Space U+2004 THREE-PER-EM SPACE \s \h \pZ \p{Zs} Age=1.1 HorizSpace Space Space_Separator White_Space U+2005 FOUR-PER-EM SPACE \s \h \pZ \p{Zs} Age=1.1 HorizSpace Space Space_Separator White_Space U+2006 SIX-PER-EM SPACE \s \h \pZ \p{Zs} Age=1.1 HorizSpace Space Space_Separator White_Space U+2007 FIGURE SPACE \s \h \pZ \p{Zs} Age=1.1 HorizSpace Space Space_Separator White_Space U+2008 PUNCTUATION SPACE \s \h \pZ \p{Zs} Age=1.1 HorizSpace Space Space_Separator White_Space U+2009 THIN SPACE \s \h \pZ \p{Zs} Age=1.1 HorizSpace Space Space_Separator White_Space U+200A HAIR SPACE \s \h \pZ \p{Zs} Age=1.1 HorizSpace Space Space_Separator White_Space U+2028 LINE SEPARATOR \s \v \R \pZ \p{Zl} Age=1.1 Pattern_White_Space Space VertSpace White_Space U+2029 PARAGRAPH SEPARATOR \s \v \R \pZ \p{Zp} Age=1.1 Pattern_White_Space Space VertSpace White_Space U+202F NARROW NO-BREAK SPACE \s \h \pZ \p{Zs} Age=3.0 HorizSpace Space Space_Separator White_Space U+205F MEDIUM MATHEMATICAL SPACE \s \h \pZ \p{Zs} Age=3.2 HorizSpace Space Space_Separator White_Space U+3000 IDEOGRAPHIC SPACE \s \h \pZ \p{Zs} Age=1.1 HorizSpace Space Space_Separator White_Space 

请注意,自从Unicode 1.1以来,除了四个以外都存在。 U + 1680 OGHAM SPACE MARK,U + 180E MONGOLIAN VOWEL SEPARATOR和U + 202F NARROW NO-BREAK SPACE进入了Unicode标准3.0版本,U + 205F MEDIUM MATHEMATICAL SPACE首次亮相3.2版本。 从那时起,已经没有更多的补充。

\p{Whitespace}属性是符合UTS#18 RL1.2“属性”所必需的,并且\p{space}别名和空格\s快捷方式都是符合UTS#18 RL1.2a所必需的“兼容性属性“ 。

如Unicode标准6.0.0的一致性文档中所述, White_Space属性是规范属性,而不是信息性,贡献性或临时属性。 由于它是规范属性,因此严格要求使用这些值根据Unicode标准正确处理所有Unicode字符数据。

在这方面,jurPattern中的任何内容都不提供符合Unicode标准的function。 实际上, Java的正则表达式无法满足 UTS#18中规定的最低可能性合规性所需的一半强制性要求 :Unicode正则表达式 。 该最低级别为1级,其中写有:

级别1是对Unicode的最低限度支持级别。 处理Unicode的所有正则表达式实现应该至少在1级。

因为Java的正则表达式甚至无法满足处理Unicode所必需的最小的最小要求,所以Java的正则表达式对于处理Unicode并不是最有用的。 因此,如果您希望产生符合要求的行为,则必须采用上面给出的明确枚举。 您可能会考虑使用我的模式重写库 。

另一种方法,如果你不想采用正则表达式方式(可能的性能提升):

 String s = "one whitespace"; public boolean hasOneWhitespace(String s) { int count = 0; for (int i = 0; i < s.length(); i++) { if(s.charAt(i) == ' ') { count++; if (count > 1) return false; } } return count == 1; } 

当然,只有当你认为" "是空格时,这才有效。 选项卡和换行符不起作用。

您也可以使用indexOf检查它:

 String s = "some text"; int indexOf = s.indexOf(' '); boolean isOneWhitespace = (indexOf >= 0 && indexOf == s.lastIndexOf(' ')); 

使用音译。 它必须是一个独立的测试,你上面的正则表达式不能与更大的正则表达式结合,仍然可以测试单个空格。

对于该测试,音译比正则表达快10-20倍。
这是一个jtr示例:

 String aInput = "This is a test, 123."; CharacterReplacer cReplacer = Perl5Parser.makeReplacer( "tr[ \\t\\r\\n\\f\\x0B][ \\t\\r\\n\\f\\x0B]" ); String aResult = cReplacer.doReplacement( aInput ); int nMatches = cReplacer.getMatches(); if (nMatches == 1) { ... } 
 String[] ss = { " ", "abc", "a bc", "abcd" }; Matcher m = Pattern.compile("^\\S*\\s\\S*$").matcher(""); for (String s : ss) { if (m.reset(s).matches()) { System.out.printf("%n>>%s<< OK%n", s); } } 

输出:

 >> << OK >>a bc<< OK