簡體   English   中英

為什么此Java正則表達式不起作用?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM