这个正则表达式不匹配的原因是什么?

时间:2010-07-04 18:18:20

标签: java regex

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

此程序打印“false”。什么?!

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

我知道这些东西,我真的...但是对于我的生活,我一直盯着它看了20分钟并尝试了我能想到的每一个变化,我显然错过了一些简单而明显的东西这里。

希望SO的许多眼睛能够在我对此失去理智之前为我挑选。

谢谢!


最终的工作版本最终为:

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 个答案:

答案 0 :(得分:3)

默认情况下,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));
        }

答案 1 :(得分:1)

如果要检查字符串是否以特定模式开头,则应使用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.util.regex.Matcher.lookingAt()

     

尝试匹配输入序列,   从一开始就开始   区域,反对模式。像   匹配方法,这个方法总是如此   从该地区的开始开始;   与那种方法不同,它没有   要求整个地区   匹配。如果匹配成功则   可以通过获得更多信息   开始,结束和组方法。

答案 2 :(得分:0)

我不喜欢正则表达式的Java风味但是这个PCRE正则表达式应该可行 ^([\d_]+v\d_\d).+ 不知道为什么使用._.代替\d_\d