正则表达式匹配组中的特殊字符

时间:2014-01-22 10:51:02

标签: java regex special-characters

我有一个类似这样的字符串:

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

你知道我做错了吗?

2 个答案:

答案 0 :(得分:3)

您不是在此行之后调用Matcher#findMatcher#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将匹配器的正则表达式应用于匹配器目标文本的当前区域,返回一个布尔值,指示是否找到匹配项。

Refer

你可以试试这个:

    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

参考 Grouping in REGEX