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

时间:2011-01-29 11:32:26

标签: java regex

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

6 个答案:

答案 0 :(得分:5)

为什么不呢?没关系,只是有点过于复杂:

\\S*\\s\\S*

答案 1 :(得分:1)

  

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

找出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版本。从那时起就没有更多的补充。

符合UTS#18 RL1.2 “Properties”需要\p{Whitespace}属性,\p{space}别名和\s空白快捷方式都是UTS#18 RL1.2a “Compatibility Properties”合规所必需的

正如The Unicode Standard 6.0.0’s Conformance document中所述,White_Space属性是规范属性,而不是信息性,贡献性或临时属性。因为它是一个规范属性,所以严格要求使用这些值来根据Unicode标准正确处理所有Unicode字符数据。

在这方面,j.u.r.Pattern中的任何内容都不提供符合Unicode标准的功能。实际上,即使在UTS #18: Unicode Regular Expressions中规定的最低可能性级别, Java的正则表达也无法满足一半强制性要求。最低级别是1级,大概写的是:

  

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

因为Java的正则表达式甚至无法满足处理Unicode所必需的最小要求,所以 Java的正则表达式对于处理Unicode并不是最有用的。因此,您必须采用上面给出的显式枚举。如果你希望产生一致的行为。您可能会考虑使用my pattern-rewriting library

答案 2 :(得分:0)

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

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;   
}

当然,只有当您认为" "为空格时,这才有效。标签和换行不起作用。

答案 3 :(得分:0)

您也可以使用indexOf

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

答案 4 :(得分:0)

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

对于此测试,音译速度比正则表达式快10-20倍 这是一个例子:

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) { ... }

答案 5 :(得分:0)

String[] ss = { " ", "abc", "a bc", "a b c d" };
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