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有多难看。啊...
答案 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