使用正規表示式處理句法分析樹

2021-08-23 12:51:10 字數 1880 閱讀 1330

1,

正規表示式如何處理巢狀結構 a.

.net

處理巢狀結構的方法

舉例說明:

問題描述:從

before (nope (yes (here) okay) after

中匹配得到最大的被

」()」

包含的文字。即顯示紅色的部分。

答案:.net

: \((?>[^()]+|\((?)|\)(?<-depth>))*(?(depth)(?!))\)

分析:(1)

、 \(

匹配左括號;

\)匹配右括號;

[^()]+

匹配非括號字串

(2)、 (?>

… .)

固化分組,固化分組的作用在於:一旦括號內的子表示式匹配之後,匹配的內容就固定下來,在接下來的匹配過程中不會改變,除非整個固化分組的括號都被棄用,在外部回溯中重新應用。該處使用固化分組的作用在於提高匹配速度。

(3)、depth

的使用:depth

實際使用了命名捕獲的

<?>…>

,它總是能夠匹配成功。正規表示式引擎的回溯堆疊儲存了當前匹配成功分組的相關資訊,而

(?)跟在 \(

後,所以它的成功匹配便可以儲存

\(的個數。跟隨在

\)後的結構

(?<-depth>)

是.net

獨有的結構,它會在匹配

\)成功之後去掉最近的

」successful depth」

標記。如果不存在這樣的

」successful depth」

標記,就會報告失敗,整個正規表示式匹配失敗:

1,每匹配乙個

\(會把正規表示式儲存的當前括號巢狀深度值加1;

2, 每匹配乙個

\)會把正規表示式儲存的當前括號巢狀深度值減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(?)|\)\s(?<-depth>))*(?(depth)(?!))\)

分析類似。 3,

使用正規表示式處理句法分析樹例項 a.

使用正規表示式獲取所有的葉結點

:   

\((?[^()]+)\s(?[^()]+)\) b.

使用正規表示式獲取所有的名詞短語

np:

\(np\s(?>[^()]+|\([^()\s]+\s(?)|\)\s(?<-depth>))*(?(depth)(?!))\) c.

使用正規表示式獲取滿足如下性質的子樹

i.該子句的標記為

sbar[^()]*

ii.該子句根節點的第乙個兒子為乙個詞性為

in的詞。

iii.

該子句的第二個兒子為乙個子句:使用

s[^()]*識別

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

(?\(s[^() ]*\s(?\(in\s[^()]+\)\s)(?\(s[^() ]*\s(?>[^()]+|\([^()\s]+\s(?)|\)\s(?<-depth>))*(?(depth)(?!))\)\s)\)\s(?#clause))

正規表示式分析

1.請分析這下面這兩個輸出吧,最好乙個乙個斜槓地分析。system.out.println 8abc8 replaceall 8 8abc system.out.println 8abc8 replaceall 8 8abc 2.為什麼a和b可以有相同的輸出,c和d卻不可以呢?system.out....

正規表示式相關 正規表示式處理html內容

前面關於顯示html文字用了瀏覽器控制項來處理 這個不過是為了解決燃眉之急不得已才使用。其實最好還是使用正規表示式處理,也就是自己寫乙個html文字直譯器,當然這個實現起來也是不容易的,首先你得將所有html文字標籤羅列出來,然後一一翻譯。下面先搞乙個簡單的例子吧。public static str...

使用正規表示式

如果原來沒有使用過正規表示式,那麼可能對這個術語和概念會不太熟悉。不過,它們並不是您想象的那麼新奇。請回想一下在硬碟上是如何查詢檔案的。您肯定會使用 和 字元來幫助查詢您正尋找的檔案。字元匹配檔名中的單個字元,而 則匹配乙個或多個字元。乙個如 data?dat 的模式可以找到下述檔案 data1.d...