1

我有一个 Java 正则表达式,它从字符串中捕获堆栈异常:

((?s).+(?:Exception|Error)[^\n]++(?:\s+at .++)+)

我的输入字符串匹配:

FOO - org.omg.CORBA.MARSHAL: com.ibm.ws.pmi.server.DataDescriptor; IllegalAccessException  minor code: 4942F23E    
         at com.ibm.rmi.io.ValueHandlerImpl.readValue(ValueHandlerImpl.java:199)
         at com.ibm.rmi.iiop.CDRInputStream.read_value(CDRInputStream.java:1429)
         at com.ibm.rmi.io.ValueHandlerImpl.read_Array(ValueHandlerImpl.java:625)
         at com.ibm.rmi.io.ValueHandlerImpl.readValueInternal(ValueHandlerImpl.java:273)
         at com.ibm.rmi.io.ValueHandlerImpl.readValue(ValueHandlerImpl.java:189)
         at com.ibm.rmi.iiop.CDRInputStream.read_value(CDRInputStream.java:1429)
         at com.ibm.ejs.sm.beans._EJSRemoteStatelessPmiService_Tie._invoke(_EJSRemoteStatelessPmiService_Tie.java:613)
         at com.ibm.CORBA.iiop.ExtendedServerDelegate.dispatch(ExtendedServerDelegate.java:515)
         at com.ibm.CORBA.iiop.ORB.process(ORB.java:2377)
         at com.ibm.CORBA.iiop.OrbWorker.run(OrbWorker.java:186)
         at com.ibm.ejs.oa.pool.ThreadPool$PooledWorker.run(ThreadPool.java:104)
         at com.ibm.ws.util.CachedThread.run(ThreadPool.java:137)< newline here >

但如果我将模式扩展到此:

FOO - ((?s).+(?:Exception|Error)[^\n]++(?:\s+at .++)+)\n

不再匹配。这是为什么?

4

2 回答 2

1

即使字符串末尾确实有换行符,它也不匹配,因为 final\n已经匹配.++(您正在使用(?s)选项)。由于.++贪婪所有格,它会将所有内容匹配到字符串的末尾而不回溯,因此\n总是会失败。

于 2012-06-20T12:09:51.563 回答
0

似乎最后一个表达式组正在捕获所有内容,包括其表达式中该字符串的结尾。因此,添加 \n 不会被发现,因为它已经是早期组的一部分。

因此,要测试使用:

FOO - ((?s).+(?:Exception|Error)([^\n]++)((?:\s+at .++)+))

您将看到它捕获的组。您会看到其中的最后一组包括 EOL 在内的所有内容。

于 2012-06-20T12:09:45.980 回答