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

标签 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());
}

对我来说,一个不明显的发现/提醒是,在访问匹配器组之前,必须调用 matches() lookingAt() 或 find() 之一。如果不是,则抛出 IllegalStateException 以及无用的消息“找不到匹配项”。尽管如此,groupCount() 仍将返回非零值,但它是谎言。不要相信它。

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

最佳答案

默认情况下,Java 坚持使用 ^$ 运算符,所以像这样的东西应该可以工作:

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

返回:

true

匹配内容:

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

关于java - 这个正则表达式不匹配是怎么回事?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3175711/

相关文章:

Java 反射 : How to get the name of a variable?

java - queryIntentActivities() 采用什么标志?

java - 如何在Java中呈现波形

jquery - 使用 JQuery 删除特定数字后的单词

regex - 序列 (? 正则表达式不完整 - 负面环视

javascript - 电子邮件地址验证的最佳做法(包括 gmail 地址中的 +)

java - 在java中使用regex g标志

java - MongoDB 无需 Java Driver 即可访问数据

java - 解析多个模式的 InputStream

java - 我可以在Java中编译两个相互依赖的类吗?