2014-01-22 98 views
2

我有一個String,它是這樣的:正則表達式匹配的組有特殊字符

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

你知道我在做什麼錯?

回答

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

謝謝,但它正在使用這個'String date = m.group(1); String name = m.group(2);' – Manuelarte

+0

是的,這是正確的,我剛剛從OP複製該片段。 – anubhava

+0

如果解決了這個問題,請不要忘記將答案標記爲已接受。 – anubhava

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

相關問題