[英]Why doesn't this Java regex work?
我有一个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
它不再匹配 。 这是为什么?
即使字符串的末尾确实有换行符,也不会匹配,因为最后的\\n
已经由.++
匹配(您正在使用(?s)
选项)。 由于.++
是贪婪的所有格,因此它将所有内容匹配到字符串的末尾而无需回溯,因此\\n
始终会失败。
似乎最后一个表达式组正在捕获所有内容,包括表达式中该字符串的结尾。 因此,将找不到\\ n,因为它已经是较早组的一部分。
因此,要测试使用:
FOO-((?s)。+(?: Exception | Error)([^ \\ n] ++)((?? \\ s + at。++)+))
您将看到它捕获的组。 您将看到那里的最后一组包括EOL。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.