我有一个类似这样的字符串:
A20130122.0000+0000-0015+0000_name
然后我想提取这些信息:
稍后将解析为日期的20130122.0000+0000-0015+0000
。
最后一部分是name
。
所以我在Java中使用这样的东西:
String regexpOfdate = "[0-9]{8}\\.[0-9]{4}\\+[0-9]{4}-[0-9]{4}\\+[0-9]{4}";
String regexpOfName = "\\w+";
Pattern p = Pattern.compile(String.format("A(%s)_(%s)", regexpOfdate, regexpOfName));
Matcher m = p.matcher(theString);
String date = m.group(0);
String name = m.group(1);
但我得到java.lang.IllegalStateException: No match found
你知道我做错了吗?
答案 0 :(得分:3)
您不是在此行之后调用Matcher#find
或Matcher#matches
方法:
Matcher m = p.matcher(theString);
试试这段代码:
Matcher m = p.matcher(theString);
if (m.find()) {
String date = m.group(1);
String name = m.group(2);
System.out.println("Date: " + date + ", name: " + name);
}
答案 1 :(得分:1)
Matcher#group
将抛出IllegalStateException
已应用于其目标文本,或前一个应用程序未成功。
Matcher#find
将匹配器的正则表达式应用于匹配器目标文本的当前区域,返回一个布尔值,指示是否找到匹配项。
你可以试试这个:
String theString="A20130122.0000+0000-0015+0000_name";
String regexpOfdate = "([0-9]{8})\\.[0-9]{4}\\+[0-9]{4}-[0-9]{4}\\+[0-9]{4}";
String regexpOfName = "(\\w+)";
Pattern p = Pattern.compile(String.format("A(%s)_(%s)", regexpOfdate, regexpOfName));
Matcher m = p.matcher(theString);
if(m.find()){
String date = m.group(2);
String name = m.group(3);
System.out.println("date: "+date);
System.out.println("name: "+name);
}
<强>输出强>
date: 20130122
name: name