【问题标题】:Why is this String not matching this regex?为什么这个字符串不匹配这个正则表达式?
【发布时间】:2013-01-16 14:25:28
【问题描述】:

我有以下代码:

public class testMatch {

    public static void main(String[] args) {
        String dummyMessage = "asdfasdfsadfsadfasdf 3 sdfasdfasdfasdf";
        String expression = "3";
        if (dummyMessage.matches(expression)){
            System.out.println("MATCH!");
        } else {
            System.out.println("NO MATCH!");
        }

    }
}

我希望这是一个成功的匹配,因为 dummyMessage 包含表达式 3 但是当我运行这个 sn-p 时,代码会打印 NO MATCH!

我不明白我做错了什么。

好的,不要回答了! .*3.* 有效 这是我在一些实时代码中遇到的问题的过度简化,正则表达式是可配置的,直到现在匹配整个字符串还可以,我现在不得不匹配字符串的一部分并且想知道为什么它是不工作。

【问题讨论】:

  • 使用简单的dummyMesasge.indexOf("3") != -1 代替正则表达式。
  • +1 表示“可以停止回答!” :)) 很多时候我也是这么想的。

标签: java regex string


【解决方案1】:

它匹配整个字符串,即像大多数其他正则表达式实现中的^3$。所以3 不匹配,例如333 或您的字符串。但是.*3.* 可以胜任。

但是,如果您只想测试字符串中是否包含“3”,则根本不需要正则表达式。请改用dummyMessage.contains(expression)

【讨论】:

  • 我打赌应该是.*?3.*
  • 是的。不过没关系,只有在使用组时才有意义。
【解决方案2】:

String#matches(regex) 判断这个字符串是否匹配给定的正则表达式。 您的字符串 dummyMessage 与表达式不匹配,因为它会尝试检查 dummyMessage 是否为 3,您可能想要 String.contains(charseq) 代替。

 String dummyMessage = "asdfasdfsadfsadfasdf 3 sdfasdfasdfasdf";
            String expression = "3";
            if (dummyMessage.contains(expression)){
                System.out.println("MATCH!");
            } else {
                System.out.println("NO MATCH!");
            }

【讨论】:

  • 它需要是一个正则表达式,我现在需要看看它是否匹配,但以后需要扩展它以进行正则表达式匹配。 .*3.* 有效。
  • @OmarKooheji 正则表达式适用于这种特殊情况.. :)
【解决方案3】:

您应该匹配matches 的整个字符串以返回true。也许尝试使用.*3.*

【讨论】:

    【解决方案4】:

    它将匹配这样的正则表达式:.*3.*

    【讨论】:

      【解决方案5】:

      使用包含(表达式)

       String dummyMessage = "asdfasdfsadfsadfasdf 3 sdfasdfasdfasdf";
              String expression = "3";
              if (dummyMessage.contains(expression)) {
                  System.out.println("MATCH!");
              } else {
                  System.out.println("NO MATCH!");
              }
      

      【讨论】:

      • 它需要是一个正则表达式匹配,包含不足以满足我的要求。
      【解决方案6】:

      默认String#matches() 测试字符串是否完全匹配正则表达式。让它工作替换

      expression = "3"
      

      expression = ".*3.*"
      

      要匹配字符串中的子字符串,请使用Matcher#find() 方法。

      【讨论】:

        【解决方案7】:

        你的正则表达式应该是.*3.*

        【讨论】:

          【解决方案8】:

          String 类的matches() 方法检查整个字符串是否匹配。 我将您的代码修改为:

          public class testMatch
          {
          
              public static void main(String[] args)
              {
                  String dummyMessage = "asdfasdfsadfsadfasdf 3 sdfasdfasdfasdf";
                  String expression = ".*3.*";
                  if (dummyMessage.matches(expression))
                  {
                      System.out.println("MATCH!");
                  }
                  else
                  {
                      System.out.println("NO MATCH!");
                  }
          
              }
          }
          

          现在可以使用了

          【讨论】:

            【解决方案9】:

            您可能正在寻找matcher.find:

            String message = "asdfasdfsadfsadfasdf 3 sdfasdf3asdfasdf";
            String expression = "3";
            
            // Really only need to do this once.
            Pattern pattern = Pattern.compile(expression);
            // Do this once for each message.
            Matcher matcher = pattern.matcher(message);
            if (matcher.find()) {
              do { 
                System.out.println("MATCH! At " + matcher.start() + "-" + matcher.end());
              } while ( matcher.find() );
            } else {
              System.out.println("NO MATCH!");
            }
            

            【讨论】:

            • 回想起来是的,这可能会更好。我将更新我的代码的下一个版本以使用它而不是 String.match
            【解决方案10】:

            相应地更改原始正则表达式 - 它当前不正确且不匹配:

            String expression = "(.*)3(.*)";
            

            或者只使用 String.contains() - 我会说这更适合这种情况。

            【讨论】:

              【解决方案11】:

              要么你这样做:

              String dummyMessage = "asdfasdfsadfsadfasdf 3 sdfasdfasdfasdf";
              String expression = "3";
              Pattern p = Pattern.compile(".*3.*");
              Matcher m = p.matcher(dummyMessage);
              boolean b = m.matches();
              if (b) {
                  System.out.println("MATCH!");
              }
              else {
                  System.out.println("NO MATCH!");
              }
              

              或者这样:

              String dummyMessage = "asdfasdfsadfadfasdf 3 sdfasdfasdfasdf";
              String expression = "3"
              if (dummyMessage.contains(expression)) {
                  System.out.println("MATCH!");
              }
              else {
                  System.out.println("NO MATCH!");
              }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-09-17
                • 2018-08-24
                • 2020-01-25
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多