Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Java中的正则表达式提取此字符串?_Java_Regex - Fatal编程技术网

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

如何使用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

我想获取“My Error”,但它返回到整个字符串的末尾,而不是与faultString行末尾的\n匹配。我尝试了很多技巧让它停在最后,但都没有成功

谢谢

你不应该通过;这将导致换行符由
*
匹配,而这正是您在这里不希望看到的

更好的正则表达式是:

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