所有加粗的元字符的雙引號均為了方便表示,所有的正則表達式均在 ‘’ ——單引號中
“/b”:元字符破婆,代表單詞的開始或者結(jié)尾,即單詞的分界胸囱,用于明確匹配
例如祷舀,我們匹配 ?‘jy’:‘\bjy\b’就可以精確匹配,hello,jy烹笔,ps:標點符號的連接不影響匹配結(jié)果
“.”:元字符裳扯,匹配除換行符以外的所有字符
“*”:元字符,代表“*”前面位置的內(nèi)容可以使用任意次谤职,包括零次饰豺,如‘.*’,任意數(shù)量不包含換行符的字符
“+”:元字符允蜈,代表“+”前面位置的內(nèi)容可以使用任意次冤吨,不包括零次,如‘.*’陷寝,任意數(shù)量不包含換行符的字符
“锅很?”:元字符,匹配0次或者一次
“{n}”:匹配n次
“{n,}”:匹配n次或者更多
“{m,n}”:匹配m-n次凤跑,‘029-\d{2,5}-\d{3,}’爆安,匹配029-開頭的,接2-5個數(shù)字仔引,接‘-’扔仓,接3個以上數(shù)字
“\d”:元字符褐奥,代表匹配數(shù)字,如翘簇,‘\d\d-\d\d\d’撬码,代表2個數(shù)字接一個‘-’,接3個數(shù)字版保,為方便起見呜笑,可以這樣寫,‘\d{2}-\d{3}’
“\s”:匹配任意的空白符彻犁,包括空格叫胁,制表符(Tab),換行符汞幢,中文全角空格等
“\w”:匹配字母或數(shù)字或下劃線或漢字等
“^”:匹配你要用來查找的字符串的開頭驼鹅,‘^\w+’匹配一行的第一個單詞(或整個字符串的第一個單詞,具體匹配哪個意思得看選項設(shè)置)
“$”:匹配結(jié)尾森篷,例如 ‘^\d{4,9}$’输钩,匹配5-9個數(shù)字,
這是匹配在整個對象中進行仲智,如果模式為按行匹配买乃,那么它們代表行起始和結(jié)束
對元字符的匹配,需要 ‘\’ 來實現(xiàn)坎藐,譬如为牍,‘\.’ 匹配 ‘.’,‘\*’匹配 ‘*’ 岩馍,‘\\’匹配 ‘\’, ‘C:\\Windows’匹配 ‘C:\Windows’
匹配自定義字符集碉咆,[ ]:例如只需要匹配 a,b,c,d,e,可以這樣寫[abcde]蛀恩;[0-9]疫铜,匹配數(shù)字;[a-z]匹配小寫字母双谆;[A-Z]匹配大寫字母壳咕;[a-z0-9A-Z]匹配任意數(shù)組或者字母
c中,識別標識符的正則表達式:‘\b[a-zA-Z]+[a-zA-Z0-9_]*\b’
分支條件:正則表達式使用 ‘|’ 表示分支條件
‘0\d{2}-\d{8}|0\d{3}-\d{7}’ 這個表達式能匹配兩種以連字號分隔的電話號碼:一種是三位區(qū)號顽馋,8位本地號(如010-12345678)谓厘,一種是4位區(qū)號,7位本地號(0376-2233445)
‘\(?0\d{2}\)?[- ]?\d{8}|0\d{2}[- ]?\d{8}’ 這個表達式匹配3位區(qū)號的電話號碼寸谜,其中區(qū)號可以用小括號括起來竟稳,也可以不用,區(qū)號與本地號間可以用連字號或空格間隔,也可以沒有間隔他爸,存在問題:(029-12345678
分組:正則表達式使用小括號來表示子表達式聂宾,也叫做分組,用于重復匹配多個字符诊笤,例如系谐,‘(\d{1,3}\.){3}\d{1,3}’ 用于匹配類似 ipv4格式的串。
這里給一個正確的ip匹配格式:‘((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)’讨跟, ‘2[0-4]\d|25[0-5]|[01]?\d\d?’ 匹配200-249或者250-255或者0-199纪他,至此整個結(jié)構(gòu)就簡單了
正則表達式為每一個分組分配一個組號,1代表第一個分組晾匠,0代表整個表達式止喷,其規(guī)則是按照左括號來進行匹配,而且實際分配過程從左至右掃描兩遍混聊,第一遍為未命名分組編號,第二遍為命名分組編號乾巧,故而命名分組的標號都大于未命名分組句喜。
反義:查找不屬于某個能簡單定義的字符類的字符
例:‘\S+’? 匹配不包含空白符的字符串,‘<a[^>]+>’ 匹配用尖括號括起來的以a開頭的字符串
向后引用:用于重復搜索前面某個分組匹配的文本
‘\b(\w+)\b\s+\1\b’ 可以用來匹配重復的單詞沟于,像go go, 或者kitty kitty咳胃,\1代表分組(第一個分組)之前捕獲的單詞,直接拿來用了旷太;自己命名分組展懈,‘\b(?<word>\w+)\b\s+\k<word>\b’ ,\k代表反向引用
小括號還有許多其他用法:
零寬斷言:(?=exp)供璧,零寬度正預測先行斷言存崖,它斷言自身出現(xiàn)的位置的后面的匹配表達式exp,例如'\b\w+(?=ing\b)'睡毒,匹配以ing結(jié)尾的單詞来惧,不包括img本身,I'm going to stay with you. 匹配到‘go’演顾;(?=<exp)供搀,零寬度正回顧后發(fā)斷言,它斷言自身出現(xiàn)的位置的前面的匹配表達式exp钠至,例如‘(\bre)\w+\b’葛虐,匹配以re開頭的單詞的后半部分,rectify棉钧,匹配到ctify屿脐。
‘(?<=\s)\d+(?=\s)’ 匹配以空白符間隔的數(shù)字
負向零寬斷言:確保某個字符沒有出現(xiàn),但并不想去匹配它,只匹配一個字符摄悯,不消費其他字符
零寬度負預測先行斷言(?!exp):斷言此位置的后面不能匹配表達式exp
'\b\w*q(?!u)\w*\b'赞季,匹配包含后面不是字母u的字母q的單詞;'\d{3}(?!\d)'匹配三位數(shù)字奢驯,而且這三位數(shù)字的后面不能是數(shù)字申钩;'\b((?!abc)\w)+\b'匹配不包含連續(xù)字符串a(chǎn)bc的單詞
零寬度負回顧后發(fā)斷言(?<!exp):斷言此位置的前面不能匹配表達式exp
(?<![a-z])\d{7}:匹配前面不是小寫字母的七位數(shù)字
(?<=<(\w+)>).*(?=<\/\1>):比配html標簽<exp>*</exp>
注釋:(?#comment) 此代表注釋,被正則表達式忽略瘪阁,譬如2[0-4]\d(?#200-249)|25[0-5](?#250-255)|[01]?\d\d?(?#0-199)
貪婪匹配與懶惰匹配:正則表達式默認為貪婪匹配撒遣,即匹配盡可能長的串,如'a\w+b'管跺,匹配'ababba'時匹配到'ababb'义黎,若要使用懶惰匹配,如下:
遞歸匹配:為了匹配成對的符號豁跑,如()廉涕,[],""之類的艇拍,使用堆棧來完成:
(?'group')把捕獲的內(nèi)容命名為group,并壓入堆棧(Stack)狐蜕;
(?'-group')從堆棧上彈出最后壓入堆棧的名為group的捕獲內(nèi)容,如果堆棧本來為空卸夕,則本分組的匹配失敳闶汀;
(?(group)yes|no)如果堆棧上存在以名為group的捕獲內(nèi)容的話快集,繼續(xù)匹配yes部分的表達式贡羔,否則繼續(xù)匹配no部分;
(?!)零寬負向先行斷言个初,由于沒有后綴表達式乖寒,試圖匹配總是失敗。