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。我已经尝试了很多技巧让它在行尾停止,但没有成功。
感谢
答案 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本身那里得到它。