正則表達式如何處理嵌套結(jié)構(gòu)

1、 .net處理嵌套結(jié)構(gòu)的方法

舉例說明:

問題描述:從before (nope (yes (here) okay) after中匹配得到最大的被”()”包含的文本。即顯示紅色的部分。

答案:.net:\((?>[^()]+|\((?<DEPTH>)|\)(?<-DEPTH>))*(?(DEPTH)(?!))\)

分析:

  • (1)、\(匹配左括號;\)匹配右括號;[^()]+匹配非括號字符串

  • (2)、(?>….)固化分組,固化分組的作用在于:一旦括號內(nèi)的子表達式匹配之后,匹配的內(nèi)容就固定下來,在接下來的匹配過程中不會改變,除非整個固化分組的括號都被棄用,在外部回溯中重新應(yīng)用。該處使用固化分組的作用在于提高匹配速度。

  • (3)、DEPTH的使用:DEPTH實際使用了命名捕獲的<?>…>,它總是能夠匹配成功。正則表達式引擎的回溯堆棧保存了當(dāng)前匹配成功分組的相關(guān)信息,而(?<DEPTH>)跟在\(后,所以它的成功匹配便可以保存\(的個數(shù)。跟隨在\)后的結(jié)構(gòu)(?<-DEPTH>)是.NET獨有的結(jié)構(gòu),它會在匹配\)成功之后去掉最近的”successful DEPTH”標記。如果不存在這樣的”successful DEPTH”標記,就會報告失敗,整個正則表達式匹配失?。?,每匹配一個\(會把正則表達式保存的當(dāng)前括號嵌套深度值加1;2, 每匹配一個\)會把正則表達式保存的當(dāng)前括號嵌套深度值減1;3, (?(DEPTH)(?!))確保匹配最后的\)時,深度為0。

2, 如何使用正則表達式處理句法分析樹

如何使用正則表達式識別一棵類似如下表示的句法分析樹?

(TOP (S (NPB (DT The) (NN question) ) (VP (VBZ remains) (SBAR-A (IN whether) (S-A (NPB (PRP they) ) (VP (MD will) (VP-A (VB be) (ADJP (JJ able) (SG (VP (TO to) (VP-A (VB help) (PUNC. us.) ) ) ) ) ) ) ) ) ) ) )

答案:\((?>[^()]+|\([^()\s]+\s(?<DEPTH>)|\)\s(?<-DEPTH>))*(?(DEPTH)(?!))\)

分析類似。

3, 使用正則表達式處理句法分析樹實例

  • a. 使用正則表達式獲取所有的葉結(jié)點: \((?<POS>[^()]+)\s(?<Leaf>[^()]+)\)

  • b. 使用正則表達式獲取所有的名詞短語NP:

\(NP\s(?>[^()]+|\([^()\s]+\s(?<DEPTH>)|\)\s(?<-DEPTH>))*(?(DEPTH)(?!))\)

  • c. 使用正則表達式獲取滿足如下性質(zhì)的子樹

i. 該子句的標記為SBAR[^()]*

ii. 該子句根節(jié)點的第一個兒子為一個詞性為IN的詞。

iii. 該子句的第二個兒子為一個子句:使用S[^()]*識別

iv. 該子句沒有其他的兒子

(?<Clause>\(S[^() ]\s(?<INWH>\(IN\s[^()]+\)\s)(?<ClauseAfterInWh>\(S[^() ]\s(?>[^()]+|\([^()\s]+\s(?<DEPTH>)|\)\s(?<-DEPTH>))*(?(DEPTH)(?!))\)\s)\)\s(?#Clause))

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容