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))