2014-01-22 3 views
2

У меня есть строка, которая является чем-то вроде этого:Regexp соответствия в группе со специальными символами

A20130122.0000+0000-0015+0000_name 

Тогда я хотел бы, чтобы извлечь эту информацию:

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

Спасибо, но он работает с использованием этой 'String date = m.group (1); Строковое имя = 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

Смежные вопросы