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

35

我有一个输入对话框,要求输入XML元素名称,我想检查它是否包含任何空格。

我可以像使用 name.matches() 这样做吗?

10个回答

82
为什么要使用正则表达式?
name.contains(" ")

那样做应该同样有效,并且速度更快。


1
如果只有一个空格,这个方法可以工作。但是,如果文本字符串有多个连续的空格(“ ”)呢? 使用正则表达式也可以为这种情况提供故障保护。 - Abhineet Kumar
@AbhineetKumar 你是什么意思?这对我有效,stackoverflow不能呈现多个空格,但这也适用于多个空格 -> String withSpace = "foo foo"; assert(withSpace.contains(" ")); - mel3kings
2
这个是否匹配所有的空白字符? - Alexander Mills
2
我们使用正则表达式是因为世界各地有很多空格字符。在中文和日文中,您可能只会遇到表意空格,并且永远不会匹配“ ”。因此,与其发明自己的所有可能空格字符的重复列表,并随着软件分发到更多地区而更改该列表,不如从第一天开始使用正则表达式并知道它是普遍正确的。 - Brent K.
你可以使用lang3库中的StringUtils.containsWhitespace(CharSequence seq)函数。 - Alisher Gulov

14

如果您使用正则表达式,它已经预定义了一个字符类 "\S" 用于任何非空白字符。

!str.matches("\\S+")

告诉您这是否为至少一个字符且所有字符均为非空白字符的字符串


4
这段代码的作用是检查一个字符串是否只由空格字符组成。 - Frank
4
@Frank,这匹配的是仅包含1个或多个空格字符的字符串。 - srujzs
2
这对于检查用户名中的空格非常有用。 - Kawu
1
很好的答案,但它错误地认为空字符串包含空格。可以轻松地与长度检查结合使用,例如(!str.matches("\S+") && (str.length() > 0)),以成为完全正确的解决方案。 - Brent K.

10
一个简单的答案,类似之前的回答是:
str.matches(".*\\s.*")
  • 第一个 ".*" 表示空格前可以有零个或多个任意字符。
  • "\\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));
}

静态代码分析指出,这个正则表达式可能容易受到回溯攻击的威胁。 - ytg
2
正则表达式中的回溯是因为匹配会一遍又一遍地重新计算,试图找到匹配最多数据的那个。在这个例子中,由于str.matches(".\s.")有两个“贪婪”匹配,所以会出现此警告。处理大量数据可能需要很长时间。像大多数lint警告一样,我们应该学习并改进。您可以通过将 .* 更改为 (.?) 来使用非贪婪匹配。因此,最终的匹配式为:str.matches("(.?)\s(.*?)");有效地停止在字符串中遇到第一个空格时寻找匹配项,而不是最后一个。这是一个很大的改进。 - Brent K.

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

}

我可以使用这个吗:boolean space = name.matches(".\s+."); - Chea Indian
@CheaIndian 不需要的正则表达式是不好的。 - Waleed Khan
@Chea:不幸的是,你不能这样做。但是你可以给多个答案点赞。 - Kendall Frey

3
if (str.indexOf(' ') >= 0)

会(稍微)更快。

2
如果您真的想要一个正则表达式,可以使用以下内容:
str.matches(".*([ \t]).*")

从这个正则表达式的意义来看,与之匹配的所有内容都不是有效的 XML 标记名称:

if(str.matches(".*([ \t]).*")) 
      print "the input string is not valid"

0

你可以使用正则表达式“\\s”

统计空格数量的示例程序 (Java 9及以上版本)

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
  public static void main(String[] args) {

    Pattern pattern = Pattern.compile("\\s", Pattern.CASE_INSENSITIVE);        
    Matcher matcher = pattern.matcher("stackoverflow is a good place to get all my answers");        

    long matchCount = matcher.results().count();   
 
    if(matchCount > 0) 
      System.out.println("Match found " + matchCount + " times.");           
    else 
      System.out.println("Match not found");        
  }
}

对于Java 8及以下版本,您可以在while循环中使用matcher.find()并递增计数。例如,

int count = 0;
while (matcher.find()) {
  count ++;
}

0

要检查一个字符串是否不包含任何空格,您可以使用

string.matches("^\\S*$")

例子:

"name"        -> true
"  "          -> false
"name xxname" -> false

0
你可以使用这段代码来检查输入字符串是否包含任何空格?
public static void main(String[]args)
{
    Scanner sc=new Scanner(System.in);
    System.out.println("enter the string...");
    String s1=sc.nextLine();
    int l=s1.length();
    int count=0;
    for(int i=0;i<l;i++)
    {
        char c=s1.charAt(i);
        if(c==' ')
        {
        System.out.println("spaces are in the position of "+i);
        System.out.println(count++);
        }
        else
        {
        System.out.println("no spaces are there");
    }
}

1
这段代码不符合OP的要求,而且存在缺陷。它似乎是试图重新实现String类的标准方法contains,但只是打印了大量冗余输出,而没有返回布尔值。 - Nowhere Man

0

这已在Android 7.0至Android 10.0上进行了测试,并且可以正常工作

使用以下代码检查字符串是否包含空格,无论是在第一个位置、中间还是最后:

 name = firstname.getText().toString(); //name is the variable that holds the string value

 Pattern space = Pattern.compile("\\s+");
 Matcher matcherSpace = space.matcher(name);
 boolean containsSpace = matcherSpace.find();

 if(constainsSpace == true){
  //string contains space
 }
 else{
  //string does not contain any space
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接