【问题标题】:How do I check whether input string contains any spaces?如何检查输入字符串是否包含空格?
【发布时间】:2012-07-14 08:47:26
【问题描述】:

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

我可以做类似 name.matches() 的事情吗?

【问题讨论】:

    标签: java regex


    【解决方案1】:

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

    name.contains(" ")
    

    这应该同样有效,而且速度更快。

    【讨论】:

    • 如果只有一个空格,则此方法有效。但是,如果文本字符串有多个连续的空格(“”)怎么办?使用正则表达式也为您提供了针对此类情况的故障保护。
    • @AbhineetKumar 你是什么意思?这对我有用,stackoverflow 不会渲染多个空格,但这也适用于多个空格 -> String withSpace = "foo foo"; assert(withSpace.contains(" "));
    • 这匹配所有的空白字符?
    • 我们使用正则表达式是因为世界上有很多空格字符。在中文和日文中,您可能只会遇到表意空格,而永远不会匹配“”。因此,与其自己发明所有可能的空白字符的重复列表,并在您的软件分发到更多地区时更改该列表,您可以从第一天开始使用正则表达式并知道它是普遍正确的。
    【解决方案2】:

    如果您将使用正则表达式,它已经为任何非空白字符预定义了字符类“\S”。

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

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

    【讨论】:

    • str.matches("\\s+")
    • @Frank,不匹配 包含 1 个或多个空白字符的字符串。
    • 这对于检查用户名中的空格很有用。
    • 很好的答案,但它错误地发现空字符串包含空格。它可以很容易地与长度检查相结合,例如 (!str.matches("\\S+") && (str.length() > 0)) 是一个完全正确的解决方案
    【解决方案3】:

    一个与前面类似的简单答案是:

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

    【讨论】:

    • 静态代码分析抱怨,这个正则表达式可能容易受到回溯攻击。
    • 正则表达式中的回溯发生是因为匹配被一遍又一遍地重新计算,试图找到与最多数据匹配的那个。此警告出现在此示例中,因为 str.matches(".*\\s.*") 作为两个“贪婪”匹配。处理大量数据可能需要大量时间。像大多数 lint 警告一样,我们应该学习和改进。您可以通过将 .* 更改为 (.*?) 来更改使用非贪婪匹配,因此最后一个将是: str.matches("(.*?)\\s(.*?)");实际上,当它到达字符串中的第一个空格而不是最后一个空格时,它会停止寻找匹配项。这是一个很大的进步。
    【解决方案4】:
    string name = "Paul Creasey";
    if (name.contains(" ")) {
    
    }
    

    【讨论】:

    • 我可以用这个吗:boolean space = name.matches(".*\\s+.*");
    • @CheaIndian No. 不必要的正则表达式不好。
    • @Chea:不幸的是你不能。但您可以对多个答案投赞成票。
    【解决方案5】:
    if (str.indexOf(' ') >= 0)
    

    会(稍微)快一些。

    【讨论】:

      【解决方案6】:

      如果你真的想要一个正则表达式,你可以使用这个:

      str.matches(".*([ \t]).*")
      

      从某种意义上说,与此正则表达式匹配的所有内容都不是有效的 xml 标记名称:

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

      【讨论】:

        【解决方案7】:

        这是在 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
         }
        

        【讨论】:

          【解决方案8】:

          你可以用这段代码检查输入的字符串是否包含空格?

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

          【讨论】:

          • 此代码不符合 OP 的要求并且包含缺陷。这似乎是重新实现 String 类的标准方法contains 的尝试,它只打印大量冗余输出而不是返回布尔值。
          【解决方案9】:

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

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

          例子:

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

          【讨论】:

            【解决方案10】:

            您可以使用正则表达式“\\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 ++;
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-01-25
              • 2021-08-17
              • 2011-01-03
              • 1970-01-01
              相关资源
              最近更新 更多