如何检查输入字符串是否包含任何空格?

Che*_*ian 20 java regex

我有一个输入对话框,询问XML元素名称,我想检查它是否有任何空格.

我可以做name.matches()吗?

Ken*_*rey 49

为什么要使用正则表达式?

name.contains(" ")
Run Code Online (Sandbox Code Playgroud)

这应该也可以,并且更快.

  • 这匹配所有空白字符? (2认同)
  • 我们使用正则表达式是因为世界上有很多空格字符。在中文和日文中,您可能只会遇到表意空格,而永远不会匹配“”。因此,您不必发明所有可能的空白字符的重复列表,并在您的软件分发到更多区域时更改该列表,而是可以从第一天开始使用正则表达式并知道它是普遍正确的。 (2认同)

Bre*_* K. 9

一个简单的答案,与之前的答案类似:

str.matches(".*\\s.*")
Run Code Online (Sandbox Code Playgroud)
  • 第一个“.*”表示空格前面可以有零个或多个任何字符的实例。
  • “\\s”表示它必须包含任何空白字符。
  • 最后一个“.*”表示空格后​​可以有零个或多个任何字符的实例。

当您将所有这些放在一起时,如果字符串中的任何位置有一个或多个空格字符,则返回 true。

这是一个简单的测试,您可以运行它来对您的解决方案进行基准测试:

boolean containsWhitespace(String str){
    return str.matches(".*\\s.*");
}

String[] testStrings = {"test", " test", "te st", "test ", "te   st", 
                        " t e s t ", " ", "", "\ttest"};
for (String eachString : testStrings) {
        System.out.println( "Does \"" + eachString + "\" contain whitespace? " + 
                             containsWhitespace(eachString));
}
Run Code Online (Sandbox Code Playgroud)

  • 正则表达式中会发生回溯,因为匹配会一遍又一遍地重新计算,试图找到与最多数据匹配的匹配。此警告出现在本例中,因为 str.matches(".*\\s.*") 作为两个“贪婪”匹配。处理大量数据可能需要大量时间。像大多数 lint 警告一样,我们应该学习和改进。您可以通过将 .* 更改为 (.*?) 来更改为使用非贪婪匹配,因此最后一个将是: str.matches("(.*?)\\s(.*?)"); 实际上,当它遇到字符串中的第一个空格而不是最后一个空格时,就会停止寻找匹配项。这是一个很大的进步。 (2认同)

Cag*_*lan 7

如果要使用Regex,则它已经为任何非空白字符提供了预定义的字符类“ \ S”。

!str.matches("\\S+")
Run Code Online (Sandbox Code Playgroud)

告诉您这是否是至少一个字符的字符串,其中所有字符均为非空格

  • str.matches(“ \\ s +”) (2认同)
  • @Frank,不匹配 *only* 包含 1 个或多个空白字符的字符串。 (2认同)
  • 这对于检查用户名中的空格很有用。 (2认同)

Pau*_*sey 5

string name = "Paul Creasey";
if (name.contains(" ")) {

}
Run Code Online (Sandbox Code Playgroud)