2009-05-15 2 views
2

Я хочу получить «Моя ошибка», но он возвращает к концу всей строки, а не соответствует \ n в конце строки faultString. Я пробовал много методов, чтобы заставить его остановиться в конце линии, без успеха.Как извлечь эту строку, используя регулярное выражение в Java?

благодарит

ответ

8

Вы не должны быть прохождение Pattern.DOTALL; что приводит к тому, что символы новой строки соответствуют .*, что именно то, что вы не хотите здесь.

Лучше регулярное выражение будет:

Pattern pattern = Pattern.compile("faultString: (.*)"); 

, а затем, вместо matcher.matches(), используйте find(), чтобы увидеть, если он появляется в любом месте строки.

Обратите внимание, что я изменил регулярное выражение только для группировки части «Моя ошибка», вместо «: Моя ошибка», как у вашего оригинала.

Просто чтобы быть ясно, вот код, я тестировал:

Pattern pattern = Pattern.compile("faultString: (.*)"); 
Matcher matcher = pattern.matcher(errorString); 
if (matcher.find()) { 
    System.out.println(matcher.group(1)); 
} 

errorString, где такая же, как ваша.
Выход:

My Error
+0

Это то, что я ищу. все еще любопытно, как заставить его работать со спичками. –

+0

С match() вы должны использовать «. * FaultString: ([^ \\ n] *). *" С Pattern.DOTALL, как описано Крисом Торнхилом и Майком Дигдоном. –

+0

Но я предпочитаю не использовать лишние точки, если я могу помочь (см. Статью Дж. Гойваертса http://www.regular-expressions.info/dot.html). В этом случае это не будет иметь никакого значения, но для будущей ссылки просто попробуйте сопоставить то, что вам нужно. (Также я бы предпочел вытащить объект Pattern в статическую конечную переменную, чтобы не перекомпилировать ее при каждом вызове.) –

1
Pattern pattern = Pattern.compile("^faultString(.*)$", Pattern.MULTILINE); 
+0

^faultString вызовет проблемы; похоже, что есть ведущее место. Как насчет "\\ bfaultString:. * $" Вместо этого? +1 для Pattern.MULTILINE независимо; это ключевой момент. – ojrac

+0

На самом деле ключевым моментом является использование find() вместо match(). –

+0

Это был один из подходов, которые я пробовал. не соответствует. –

1

Это выглядит как формат файла свойств. Было бы проще загрузить эту строку в java.util.Property, используя StringReader, а затем прочесть ее?

+0

Я пытаюсь заставить себя решить проблемы синтаксического анализа, используя некоторое регулярное выражение, чтобы я мог лучше изучить регулярные выражения. я редко их использую, но хотел бы поправиться. Я мог бы решить эту проблему намного быстрее другими подходами, конечно, но я хочу расширить свой набор навыков. –

1

Это работает с .matches() подход:

Pattern pattern = Pattern.compile(".*faultString([^\\n]*).*", Pattern.DOTALL); 
2

я бы, вероятно, очистить регулярное выражение Криса к следующему: ".*faultString:\\s*([^\\n]*).*"

1

Имейте в виду, что регулярное выражение материал стоит дорого. Четан имеет правильную идею.

Вот некоторые примеры code--

String errorString = "AxisFault\n" 
      + "   faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.generalException\n" 
      + "   faultSubcode: \n" 
      + "   faultString: My Error\n" 
      + "   faultActor: \n" 
      + "   faultNode: \n" 
      + "   faultDetail: \n" 
      + "     {}string: this is the fault detail"; 

    Properties p = new Properties(); 
    ByteArrayInputStream bis = new ByteArrayInputStream(errorString 
      .getBytes()); 

    try { 
     p.load(bis); 
    } catch (IOException e) { 

    } 

    System.out.println(p.toString()); 
    System.out.println(p.getProperty("faultString")); 
+0

Не думаю, что Свойства обрабатывают разделители, отличные от '='. Разумеется, пользовательский парсер может быть быстрее, но обычно не нужно слишком беспокоиться о производительности отчетов об ошибках. –

+0

Код работает успешно, поэтому я уверен, что он обрабатывает двоеточия. – Nathan

+0

синтаксический разбор строки не в персидентной области, поэтому перфоманс не важен ... –

0

Может getFaultString? :)

Редактировать: or ((AxisFault) exception.getRootCause()). GetFaultString(). Я просто подумал, что вы, возможно, упустили из виду тот факт, что вы можете получить это непосредственно из самого AxisFault.

+0

Я хочу вытащить несколько полей. –

+0

На самом деле, взглянув более внимательно на AxisFault, ваш подход имеет больше смысла. regex - это перестройка. все еще хорошее упражнение, чтобы возиться с рег-ex-хау. –

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