簡體   English   中英

使用C#正則表達式匹配嵌套括號

[英]Matching nested brackets with C# Regex

我想從語法分析器的輸出(名為Stanford Parser)中匹配一組特定的嵌套括號,如下所示。

(ROOT (S (NP (PRP He)) (VP (VBD gave) (NP (PRP me)) (NP (DT a) (NN pen))) (. .)))
(ROOT (S (NP (PRP He)) (VP (VBD said) (SBAR (IN that) (S (NP (PRP he)) (VP (VBD was) (ADJP (JJ hungry)))))) (. .)))
(ROOT (S (NP (PRP I)) (VP (VBD wrote) (NP (PRP him)) (NP (DT a) (JJ long) (NN letter))) (. .)))
(ROOT (S (NP (PRP He)) (VP (VBD provided) (NP (DT the) (JJ old) (NN bagger)) (NP (NP (DT a) (NN lot)) (PP (IN of) (NP (NN food))))) (. .)))

因此要匹配(VP...) 但是有條件:(1 (NP..)此后應具有1 (VBD..)和2 (NP..) VBD沒問題。(2)兩套NP是問題。 NP支架的結構是不可預測的。 唯一可預測的是NP和像這樣的嵌套括號(NP bla bla bla ) 因此,我想捕獲每個NP ,這涉及將嵌套括號與NP組合在一起。 下面的正則表達式匹配我想要的(至少在此示例中),但是沒有定義(NP bla bla bla )部分。 下面的半成品正則表達式不包含我尋求的解決方案,即其中包含所有遞歸括號子節點的NP部分。

\(VP\s+\(V\w+([^()]+|(?<Level>\()|(?<-Level>\)))+(?(Level)(?!))\)

這里有一些關於“平衡組定義”的信息 ,它解釋了嵌套括號,但沒有為我的問題提供解決方案。

好吧,我不確定我是否真的了解您到底想要什么,但是我會嘗試一下。 :)

\\(VP.*\\(V(\\w{1,2}).*\\(NP.*\\){2}\\)這與給定示例和您想要的一種特殊情況匹配4次。

您可能想查看regexpal.com進行檢查。

編輯:我用過。 (點)很多,您可能想要更嚴格一些。

不,謝謝。 正則表達式非常有用,但是您要的是它不能做的事情。 正則表達式是一種“確定性有限自動機”,無法進行計數: https : //en.wikipedia.org/wiki/Deterministic_finite_automaton

因此,您可能想要的是一個簡單的遞歸下降解析器,它將使您可以遞歸地匹配括號。 它可能比您嘗試使正則表達式工作所花費的工作少,特別是對於您所擁有的簡單語法而言。 有關描述和示例,您可以從這里開始: https : //en.wikipedia.org/wiki/Recursive_descent_parser

(嘿,您知道什么!那些計算機科學課證明是有用的!)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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