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

文字列の最後に実際に改行がある場合でも、最後\nがすでに一致しているため、一致しません.++(オプションを使用してい(?s)ます)。貪欲な所有格のよう.++に、バックトラックせずに文字列の最後まですべてに一致するため、\n常に失敗します。

于 2012-06-20T12:09:51.563 に答える
0

最後の式グループは、その式の文字列の末尾を含むすべてをキャプチャしているようです。そのため、\n の追加は、既に以前のグループの一部であるため、検出されません。

したがって、使用をテストするには:

FOO - ((?s).+(?:例外|エラー)([^\n]++)((?:\s+at .++)+))

それによってキャプチャされたグループが表示されます。そして、最後のグループには EOL を含むすべてが含まれていることがわかります。

于 2012-06-20T12:09:45.980 に答える