为什么';这不是Java正则表达式吗?

为什么';这不是Java正则表达式吗?,java,regex,Java,Regex,我有一个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.re

我有一个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 >

它。这是为什么?

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

因此,要测试使用:

FOO-((?)+(?:异常|错误)([^\n]++)((?:\s+at.++)+)


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

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

因此,要测试使用:

FOO-((?)+(?:异常|错误)([^\n]++)((?:\s+at.++)+)


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

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

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

这是因为即使没有最后一个\n,您也已经匹配了整个输入字符串,因此final\n没有任何可匹配的内容。这是因为即使没有final,您也已经匹配了整个输入字符串,因此final\n没有可匹配的内容。
FOO - ((?s).+(?:Exception|Error)[^\n]++(?:\s+at .++)+)\n