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