2017年2月25日 星期六

正則

^ $ * + ? { } [ ] \ | ( ) . -
等為正則表達式的保留字元

javascript 的保留字多 /

------------------------------------------------------------------
\d : [0-9]
\w : [A-Za-z0-9_](不含中文)
\s :  空白, 換行
\n :  換行
\b :  詞邊界  
------------------------------------------------------------------
\D   vs   \d
\W  vs   \w
\s   vs   \S
\b   vs   \B

\b => \w頭尾兩端的(\W)
------------------------------------------------------------------
{0, m} :  前一字元匹配 0 到 n 次
{n, }  :  前一字元匹配 n 到 無限 次 
------------------------------------------------------------------
?  :  匹配 0-1 次  
*  :  匹配 0-   次
+  :  匹配 1-   次

------------------------------------------------------------------
[CD][a-z]+   =  (C|D)[a-z]+  =  [CD]{1}[a-z]+

/(http.*\\\\.*|http.*\/\/.*)/  ==>  匹配  /http.*\\\\.*/  or  /http.*\/\/.*/ 

(gray|grey)  =  gr(a|e)y  =  gr[ae]y
------------------------------------------------------------------
重複匹配
/(.)(.) \2\1/  => AD DA
------------------------------------------------------------------
(0 | 1 | 2 | 3 | 4 | 5 ) = [ 0 1 2 3 4 5 ]
------------------------------------------------------------------
向前查找>>
    XXX(?=YYY)  ==> XXX 後面要有 YYY 但只有 XXX會被取代

否定向前查找>>
    XXX(?!YYY)

向後查找>>
    (?<=YYY)XXX  ==> XXX 前面要有 YYY 但只有 XXX會被取代

否定向後查找>>
    (?<!YYY)XXX
------------------------------------------------------------------
關閉貪婪搜尋有用的情況:
=> 有兩個以上的長度條件下,去選擇是否採貪婪搜尋
如 
*
+
{n,m}
------------------------------------------------------------------

預設搜索是貪婪法,如 {n, m} => 優先搜索 m 次有符合就放棄
{n, m}?  則是惰性匹配  => 搜索 n 次有搜索到就放棄
------------------------------------------------------------------
Exp 1>>
(
<hhhh><ggg><hhhh><ggg>
)


(( /<.{4,20}>/  ==> (匹配) array('<hhhh><ggg><hhhh><ggg>') )) 
==>貪婪搜索會用最大化搜尋
1.當搜尋過第一個字'<'後,到了.{4,20}會先取{4,20}中最大的 20 來找
2.若20個任意字後面要跟'>'沒找到,就遞減搜尋直到4個任意字後面有跟'>'

(( /<.{4,20}?>/  ==> (匹配)<hhhh> ))
==>若取消貪婪搜尋
1.當搜尋過第一個字'<'後,到了.{4,20}會先取{4,20}中最小的 4 來找
2.找到'<hhhh>'
3.剩下'<ggg><hhhh><ggg>'
4.重頭再用'/<.{4,20}?>/'匹配剩下的'<ggg><hhhh><ggg>'
------------------------------------------------------------------
Exp 2>>
(
<html><head><title></title></head><body></body></html>
)


/<.*>/ ==> all
/<.*?>/  ==> <html>.........
------------------------------------------------------------------
Exp 3>>
(
255.255.256.255
)

A => /(.{3}\.|.{3}(?=\.))/
B => /(.{3}(?=\.)|.{3}\.)/

A.B都是再檢查4個字與差不多條件....但順序不同結果也不同
規則是由左到右

沒有留言: