如何使用Java中的正则表达式提取此字符串?
我想获取“My Error”,但它返回到整个字符串的末尾,而不是与faultString行末尾的\n匹配。我尝试了很多技巧让它停在最后,但都没有成功 谢谢你不应该通过;这将导致换行符由如何使用Java中的正则表达式提取此字符串?,java,regex,Java,Regex,我想获取“My Error”,但它返回到整个字符串的末尾,而不是与faultString行末尾的\n匹配。我尝试了很多技巧让它停在最后,但都没有成功 谢谢你不应该通过;这将导致换行符由*匹配,而这正是您在这里不希望看到的 更好的正则表达式是: errorString="AxisFault\n faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.generalException\n faultSubcode: \n fau
*
匹配,而这正是您在这里不希望看到的
更好的正则表达式是:
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;
}
然后,不要使用matcher.matches()
,而是使用查看它是否出现在字符串中的任何位置
还要注意,我已经修改了正则表达式,只对“我的错误”部分进行分组,而不是像原来的一个那样对“:我的错误”进行分组
为了清楚起见,以下是我测试的代码:
Pattern pattern = Pattern.compile("faultString: (.*)");
其中errorString
与您的相同。输出为:
Pattern pattern = Pattern.compile("faultString: (.*)");
Matcher matcher = pattern.matcher(errorString);
if (matcher.find()) {
System.out.println(matcher.group(1));
}
我的错误这看起来像属性文件格式。使用
StringReader
将此字符串加载到java.util.Property
中,然后从中读取是否更容易?这与.matches()方法一起工作:
Pattern pattern = Pattern.compile("^faultString(.*)$", Pattern.MULTILINE);
我可能会将Chris的正则表达式整理为以下内容:
“*faultString:\\s*([^\\n]*).*”
请记住正则表达式的东西很昂贵。契丹的想法是正确的
下面是一些示例代码--
也许吧?:)
编辑:或((AxisFault)异常。getRootCause()).getFaultString()。我只是想,您可能忽略了一个事实,即您可以直接从AxisFault本身获得它。^faultString会带来麻烦;看起来有一个引导空间。改为“\\b故障字符串:.*$”怎么样+1表示模式。不考虑多行;这就是关键点。实际上,关键点是使用find()而不是matches()。我认为属性不会处理“=”以外的分隔符。当然,自定义解析器可以更快,但通常不需要太担心错误报告的性能。我想提取几个字段。实际上,在仔细研究AxisFault之后,您的方法更有意义。regex远远超过了工程学。这仍然是一个很好的练习来处理regex的东西。我试图强迫自己使用regex解决字符串解析问题一段时间,这样我才能更好地学习正则表达式。我很少使用它们,但我想做得更好。当然,我可以用其他方法更快地解决这个问题,但我想扩展我的技能……这就是我要找的。但仍然很好奇如何使其与匹配项一起工作。对于matches(),您可以将“*faultString:([^\\n]*).*)”与Pattern.DOTALL一起使用,如Chris Thornhill和Mike Digdon所述。但如果我能帮上忙,我不喜欢使用无关的点(请参阅Jan Goyvaerts的文章)。在这种情况下,它不会有什么不同,但为了将来的参考,只需尝试匹配您需要的。(另外,我更愿意将模式对象拉入一个静态最终变量,以避免在每次调用时重新编译它。)认识Matcher.matches()和Matcher.find()之间的区别非常重要。matches方法尝试根据模式匹配整个输入序列。除非模式从头到尾匹配整个字符串,否则它不会返回true。这通常与^和$一起用于表示字符串的开头和结尾。find方法扫描输入序列,寻找与模式匹配的下一个子序列。如果模式出现在字符串中的任何位置,它将返回true。
Pattern pattern = Pattern.compile("^faultString(.*)$", Pattern.MULTILINE);
Pattern pattern = Pattern.compile(".*faultString([^\\n]*).*", Pattern.DOTALL);
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"));