代码之家  ›  专栏  ›  技术社区  ›  itsadok

这个正则表达式不匹配是怎么回事?

  •  1
  • itsadok  · 技术社区  · 14 年前
    public class PatternTest {
      public static void main(String[] args) {
        System.out.println("117_117_0009v0_172_5738_5740".matches("^([0-9_]+v._.)"));
      }
    }
    

    这个程序打印“假”。什么?!

    我希望匹配字符串的前缀:“117_117_0009v0_1”

    我知道这些,真的我知道…但在我的一生中,我已经盯着这个20分钟了,尝试了我能想到的每一种变化,我显然错过了一些简单而明显的东西。

    希望这么多的眼睛能在我为此失去理智之前帮我挑出来。

    谢谢!


    最终的工作版本是:

    String text = "117_117_0009v0_172_5738_5740";
    String regex = "[0-9_]+v._.";
    
    Pattern p = Pattern.compile(regex);
    
    Mather m = p.matcher(text);
    if (m.lookingAt()) {
      System.out.println(m.group());
    }
    

    对于我来说,一个不明显的发现/提醒是,在访问matcher组之前,必须调用matches()lookingat()或find()中的一个。如果不是,则引发IllegalstateException,并显示无用的消息“Match Not Found”。尽管如此,groupCount()仍将返回非零,但它是谎言。不要相信它。

    我忘了这个API有多难看。啊…

    3 回复  |  直到 10 年前
        1
  •  3
  •   npinti    14 年前

    默认情况下,Java ^ $ 运算符,因此类似这样的操作应该有效:

    public class PatternTest {
      public static void main(String[] args) {
        System.out.println("117_117_0009v0_172_5738_5740".matches("^([0-9_]+v._.).*$"));
      }
    }
    

    返回:

    匹配内容:

    117_117_0009v0_1
    

    这是我用来提取匹配项的代码:

           Pattern p = Pattern.compile("^([0-9_]+v._.).*$");
           String str = "117_117_0009v0_172_5738_5740";
    
            Matcher m = p.matcher(str);
            if (m.matches())
            {
                System.out.println(m.group(1));
            }
    
        2
  •  1
  •   Vitalii Fedorenko    14 年前

    如果要检查字符串是否以某个模式开头,则应使用 Matcher.lookingAt() 方法:

    Pattern pattern = Pattern.compile("([0-9_]+v._.)");
    Matcher matcher = pattern.matcher("117_117_0009v0_172_5738_5740");
    if (matcher.lookingAt()) {
      int groupCount = matcher.groupCount();
      for (int i = 0; i <= groupCount; i++) {
         System.out.println(i + " : " + matcher.group(i));
      }
    }
    

    Javadoc:

    布尔 Java.UTI.ReXEX.Matk.LaungEnter()

    尝试匹配输入序列, 从 区域,与模式相反。像 匹配方法,此方法始终 从区域开始; 与该方法不同,它没有 要求整个区域 相配的。如果匹配成功,则 更多信息可通过 开始、结束和分组方法。

        3
  •  0
  •   Neel Basu    14 年前

    我没有JAVA正则表达式的味道,但是这个PCRE正则表达式应该工作。 ^([\d_]+v\d_\d).+ 不知道你为什么用 ._. 而不是 \d_\d