如何在Java中使用正则表达式提取此字符串?

时间:2009-05-15 18:15:55

标签: java regex

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;
}

我想得到“我的错误”,但它返回到整个字符串的末尾,而不是匹配到faultString行末尾的\ n。我已经尝试了很多技巧让它在行尾停止,但没有成功。

感谢

7 个答案:

答案 0 :(得分:8)

你不应该通过Pattern.DOTALL;这会导致换行符与.*匹配,这正是您 想要的。

更好的正则表达式是:

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

然后,使用find()代替matcher.matches(),看看它是否出现在字符串中的任何位置。

另请注意,我已将正则表达式修改为仅对“我的错误”部分进行分组,而不是像原始版本那样对“:我的错误”进行分组。

为了清楚起见,这是我测试的代码:

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

其中errorString与您的相同。
输出是:

My Error

答案 1 :(得分:2)

我可能会将Chris的正则表达式清理为以下内容:".*faultString:\\s*([^\\n]*).*"

答案 2 :(得分:1)

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

答案 3 :(得分:1)

这看起来像属性文件格式。使用java.util.Property将此字符串加载到StringReader然后从中读取会更容易吗?

答案 4 :(得分:1)

这适用于.matches()方法:

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

答案 5 :(得分:1)

请记住,正则表达式的东西很贵。 Chetan有正确的想法。

以下是一些示例代码 -

    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"));

答案 6 :(得分:0)

也许getFaultString? :)

编辑:或((AxisFault)exception.getRootCause())。getFaultString()。我只是觉得你可能忽略了这样一个事实,你可以直接从AxisFault本身那里得到它。