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/