http://www.ipc.me/regular_expression_07681.html
文章錯誤:
?? ?1 字符集的一些應用 第二個正則少了一個左方括號。
?? ?2 字符集的元字符 /[]x]/中的第一個]左邊少了一個轉義符,在這種情況下轉義符還是不能省略的。
擴展
?? ?1 回車符 換行符 http://www.cnblogs.com/yunf/archive/2011/04/20/2021830.html
表達式引擎
?? ?正則表達式引擎室一種可以處理正則表達式的軟件,通常是大程序的一部分,不用的表達式互不兼容(JDK .NET)。
?? ?兩種類型:文本導向(text-dereced/DFA) 和 正則導向 (regex-directed/NFA)
?? ?主流是NFA,因為(惰性/lazy quantifiers)以及(反向引用/backreferences)只能在正則NFA中實現。
?? ?分辨兩種引擎的方法:
?? ??? ?/reg|reg not/ 如果匹配到reg,那么是正則導向;如果是reg not,是文本導向。
?? ??? ?因為正則導向引擎總是返回最左邊的匹配,猴急。
?? ?
特殊字符(11)
?? ?[ ] ()???? ^? $?? +?????? \ |???? . ?
?? ?2個括號??? 4? 6?? 12???? (\)??? shift左邊2個
?? ?
?? ?在一些預編譯(C++)中,\ 數量加倍
不顯示的字符
?? ?\t tab(0x09)
?? ?\r 回車(0x0D)
?? ?\n 換行(0x0A)
?? ?顯示的字符,是敲“ABC123”是可以看到的,那換行/回車/Tab 鍵 是看不到的。
連字符 -
?? ?可以指定范圍,如[0-9a-fxA-FX]
?? ?
反字符 [^]
?? ?q[^u]不會匹配iraq,會匹配 Iraq is a country,因為[]必須要匹配一個字符
?? ?如果你只想匹配一個q,條件是q后面有一個不是u的字符,我們可以用后面將講到的向前查看來解決?
?? ?在[]中, 有 4 個元字符需要轉義 ] \ ^ - 其他元字符不需要轉義,但是其中 2 個元字符(^-)的轉義符不是必須的
?? ?只要將他們放在一個不可能使用到他們的特殊位置,這樣子可以增加可讀性。
?? ?例如^只要不放到 [ 的后面,就可以不用轉義符。[x^] [-x]
?? ?
常用的字符集簡寫
?? ?\d 0-9?? ?取反\D
?? ?\w A-Za-z0-9 取反\W
?? ?\s 空白字符 空格符 Tab符 回車\r 換行\n? 取反 \S
?? ?
?? ?[0-9]+ 僅僅想重復匹配那個數字 向后引用?
注意貪婪
?? ??* + 都是貪婪的,會盡可能的重復前導字符。(?會盡可能匹配一次)
?? ?例子:
?? ?var reg = /<.+>/;// /<[^>]+>/ 或者 /<.+?>/
?? ?var str ='This is a <EM>first</EM> test';
?? ?console.log(str.match(reg));
?? ?表達式<.+會貪婪匹配到字符串結束(最后還有個換行符,'.'不匹配換行符,(換行符是怎么出來的?)),然后表達式的剩余?? ??? ?部分 > 去匹配換行符,匹配不成功,然后進行回溯(!!),<.+ 會丟掉匹配的最后一個字符 讓>去匹配,直到成功為止。最后?? ?停留在<EM>first</EM。匹配結果是<EM>first</EM>。
?? ?
?? ?'+'的貪婪性使得表達式匹配到最左邊的最長的匹配。
?? ?
?? ?不管是惰性匹配還是貪婪匹配,都會進行回溯,會影響效率。
?? ?. == [^\r\n](Window)不匹配換行符的歷史原因:為早期使用正則表達式的工具是基于行的。它們都是一行一行的讀入一個文件?? ??? ?,將正則表達式分別應用到每一行上去。在這些工具中,字符串是不包含新行符(\n)的(歷史)。現代的工具和語言能夠將正則?? ?表達式應用到很大的字符串甚至整個文件上去。?? ?
?? ?單行模式,將整個文件一并讀入,此時.匹配新行符,只影響.的匹配范圍。
?? ?***
?? ?多行模式和單行模式沒有什么關系,只是名字相似。
?? ?多行模式下,只影響^ 和 $ 的匹配范圍
?? ?^ 可以匹配字符串開頭(字符串的開始位置),也可以匹配行的開頭(即換行符\n之后的位置)
?? ?$ 可以匹配字符串結尾(字符串的結束位置), 也可以匹配行的結尾(即換行符\n之前的位置)
?? ?Regex.Match(“string”,”regex”,RegexOptions.SingleLine)可以激活單行模式。
?? ?var reg = /(?:0[1-9]|1[0-2])[-/.](?:0[1-9]|[1-2]\d|3[01])/;//(?:)匹配但是不獲取,經常和| 配合使用
?? ?var str ='12/01';
?? ?console.log(str.match(reg));
?? ?字符串開始和結束的錨定 (^$)
?? ?^$ 和一般的表達式符號不用,他不匹配任何字符,他會匹配字符之前或者之后的位置。
?? ?“first line\n\rsecond line”其中的 \n\r 在WINDOWS下是換行回車的標志,正則表達式引擎提供一個選項可以是擴展 '^'
?? ?
絕對錨定
?? ?\A 和 \Z 只匹配整個字符串的開始位置和結束位置,即使你使用了多行模式。
單詞邊界\b <=> \B
?? ?也是一種錨
?? ?1)在字符串的第一個字符前的位置(如果字符串的第一個字符是一個“單詞字符”)
?? ?2)在字符串的最后一個字符后的位置(如果字符串的最后一個字符是一個“單詞字符”)
?? ?3)在一個“單詞字符”和“非單詞字符”之間,其中“非單詞字符”緊跟在“單詞字符”之后
?? ?4) 在一個“非單詞字符”和“單詞字符”之間,其中“單詞字符”緊跟在“非單詞字符”后面
?? ?*單詞字符 指 \w == [a-zA-Z0-9]
?? ?
組()與 后向引用
?? ?()匹配后生成組,\0代表整個背匹配的結果,用\N來引用剩余的,()經常會和|配合使用,用來限制|的范圍,(?: pattern)不?? ??? ?獲取匹配結果...
?? ?<([A-Z][A-Z0-9]*)[^>]*>.*?</\1> 可以用來匹配標簽。
?? ?注意點:
?? ??? ?后向引用不能用于他自身,([abc]\1)
?? ??? ?后向引用不能用于字符集內部 (a)[\1b]
?? ??? ?當對組使用重復操作符時,緩存里后向引用內容會被不斷刷新,只保留最后匹配的內容。
模式
?? ?i 大小寫不敏感
?? ?s 單行模式
?? ?m 多行模式
?? ?(?i)te(?-i)st 能匹配TEst 原因就是?i開啟了不敏感,隨后又關閉了敏感,變得敏感了。
?? ?
?? ?
?? ?
???
轉載于:https://www.cnblogs.com/cy056/archive/2013/03/11/regExp.html