正規表示式 FNA 的幾個特性 一

2021-05-22 06:53:25 字數 1531 閱讀 2060

最近沒事作研讀了一下正規表示式,感覺很有意思的。很多特性grep ,awk ,sed 是不支援的,些特性都是基於nfa引擎的正規表示式,如perl 5 ,php 等語言都支援。

一、固化分組 (?>)     基於dfa 引擎的正規表示式不支援

簡單點講固化分組目的就是為了不讓引擎回溯,從而提高效率。

看乙個例子 m/(?>.*)a$/   這裡是想匹配a結尾,但這裡什麼都匹配不到,因為.* 已經吃掉所有的字元並且不回溯,a就不會匹配成功。所以在固化分組中不能用.*  ;再看(?>.*?)這裡什麼也沒有匹配,因為*?是忽略優先就是優先什麼都不匹配並且放棄備用狀態。

再看一例 m/(?>[^<]*)(?>(?!)<[^<]*).*?/ 相信很多朋友對這個都很熟悉,這裡是想匹配...

先看(?>[^<]*) 這裡是想聽掉 非< 之前的所有字元 ;(?!)<[^<]*  , (?!)《這是右否定環視,意思是 < 右邊邊不能是

二、回溯 

dna 沒有回溯所以新效率很高,在nfa 中要盡量避免.比如可以用固化分組或懶惰性如 *? ,+?, ?? ,{}? 

三、多選結構的最左匹配結果

dfa 引擎返回的是最優的匹配結果,但nfa引擎比較急總是返回最左匹配的結果

如 $str = "jan 31"  $str =~ (jan ([0-2]?[1-9]|[123][01]))  這裡返回的是jan 3  因為[0-2]?[1-9] 最先匹配到的是3 ,所在在多選結構時要把最長的也就是最想匹配的結果表示式放在最前 如 /(jan ([123][01]|[0-2]?[1-9]))/

四、忽略優先

忽略優先對應的是匹配優先 ,忽略優先的題詞有*? , +? , {}? ,??  ,使用忽略優先可以避免回溯

五、環視

環視有: 左肯定環視 ,左否定環視, 右肯定環視 ,右否定環視

環視不占有匹配字元,它只是指定字元的位置。

左肯定環視 :(?<=) 如 (?<=)    這裡指左邊位置存在字串

左否定環視 :(?)    這裡指左邊位置不能存在字串

右肯定環視 :(?<) 如 (?=)    這裡指右邊位置存在字串

右否定環視 :(?!) 如 (?!)    這裡指右邊位置不能存在字串

六、單行模式與多行模式

單行模式也就是點通模式 ,主要是因為是最期版本 . 不能匹配/n ,現在為了能讓.也能匹配 /n,就提出了單行模式 即加/s修飾符。m/../s

多行模式也就是增強的行錨點模式,我們知道^ $ 分別只能匹配字串的 開始和結束位置,如果想讓其能匹配每一行的開始和結束位置也是就/n的前後位置。這就要用到多行模式 即加/m修飾符, m/../m 。再說一下/a, /a在任何模式下只能匹配字串的開始位置, /z則要以匹配行的結束和字串的結束位置,而/z 只能匹配字串的結束位置。

七、錨定

錨定除了上面說的^ $ /a /z /z再說一下/b ,/b是單詞 的邊界符錨定 如:

$str = 'hello he'  ; $str =~ s/(/bhe/b)/this/g ; print $str 結果是hello this 而不是thisllo he

解析幾個正規表示式

net framework 中的正規表示式引擎由 regex 類表示。正規表示式引擎負責分析和編譯正規表示式,並執行用於將正規表示式模式與輸入字串相匹配的操作。可以呼叫 regex 類的方法來執行下列操作 以下各部分對這些操作進行了描述。如果字串與模式匹配,則 regex.ismatch 方法返回 ...

幾個實用的正規表示式

string tt s.split s 按照空格分割字串,多個空格作為乙個空格對字串進行分割 string qq s.replaceall 把字串s中的多個空格替換為乙個空格 string s1 d 非負整數 正整數 0 system.out.println 0 matches s1 是乙個非負整數...

常用的幾個正規表示式

匹配中文字元的正規表示式 u4e00 u9fa5 評注 匹配中文還真是個頭疼的事,有了這個表示式就好辦了 匹配雙位元組字元 包括漢字在內 x00 xff 評注 可以用來計算字串的長度 乙個雙位元組字元長度計2,ascii字元計1 匹配空白行的正規表示式 n s r 評注 可以用來刪除空白行 匹配ht...