Как извлечь эту строку с помощью регулярного выражения в Java? - PullRequest
2 голосов
/ 15 мая 2009
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"


Pattern pattern = Pattern.compile(".*faultString(.*)", Pattern.DOTALL);
Matcher matcher = pattern.matcher(errorString);
if (matcher.matches()) {
   String match = matcher.group(1);
   return match;
}

Я хочу получить "Моя ошибка", но она возвращается к концу всей строки вместо соответствия \ n в конце строки faultString. Я перепробовал много техник, чтобы остановить его в конце строки, но безуспешно.

спасибо

Ответы [ 7 ]

8 голосов
/ 15 мая 2009

Вы не должны проходить мимо 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
2 голосов
/ 15 мая 2009

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

1 голос
/ 15 мая 2009

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

Вот пример кода -

    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"));
1 голос
/ 15 мая 2009

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

Pattern pattern = Pattern.compile(".*faultString([^\\n]*).*", Pattern.DOTALL);
1 голос
/ 15 мая 2009

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

1 голос
/ 15 мая 2009
Pattern pattern = Pattern.compile("^faultString(.*)$", Pattern.MULTILINE);
0 голосов
/ 15 мая 2009

Может быть getFaultString ? :)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...