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