正則表達(dá)式是由元字符和普通字符組成。所謂元字符就是類似于“*”、“?”之類的有意義的字符,所謂的普通字符就是字符串中常用的字符。將普通字符和元字符放在一對(duì)斜杠(/)中,就可以組成一個(gè)正則表達(dá)式。
1、匹配字符
最簡(jiǎn)單的正則表達(dá)式就是字符本身的匹配,這種匹配方法相當(dāng)于精確查找。
比如:/abc/? ,可以匹配到字符串“abc”(注意是匹配到字符串“abc”,不是單個(gè)字符“a”或“b”或“c”);
正則表達(dá)式中有很多字符有特殊意義,要匹配單個(gè)的字符(比如“?”),需要在轉(zhuǎn)義字符前加上反斜杠“\”,
正則表達(dá)式中有很多轉(zhuǎn)義字符:“\!”,“\$”,“\^”,“\*”,“\+”,“\=”,“\|”,“\.”,“\?”,“\\”,“\/”,“\(”,“\)”,“\[”,“\]”,“\{”,“\}”,“\o”,“\t”,“\n”,“\v”,“\f”,“\r”,“\xnn”,“\uxxxx”,“\cX”。
2、字符類
字符類在正則表達(dá)式中可以代表一系列字符,而不是只能代表一個(gè)字符或一個(gè)子字符串,字符串類是以中括號(hào)作為分界符的。
比如:/[ABC]/?? ,可以匹配到“A”或“B”或“C”單個(gè)字符;假如要匹配的字符串為“JAVASCRIPT”,只會(huì)匹配到第一個(gè)“A”(因?yàn)槌鞘褂萌帜J綐?biāo)志,在完成第一次匹配后不會(huì)再進(jìn)行后面的匹配了);
使用字符類還可以制定一系列字符:/[A-Z]/? //可以匹配到字母A到Z,/[a-z]/? //可以匹配到字母a到z,/[A-Za-z]/? //可以匹配到字母A到Z和字母a到z,/[0-9]/? //可以匹配到數(shù)字0到9,/[A-Za-z0-9]/? //可以匹配到字母A到Z、字母a到z、數(shù)字0到0,/[A-D159]/? //可以匹配到字母A到D和數(shù)字1、5、9;
除了要將匹配的字符放在[]中外,字符類還定義了一些特殊的字符,可以更加靈活地匹配到字符串;比如:字符類“XYZ”:字符集,可以匹配到中括號(hào)中的字符;字符類“^”:非字符集,可以匹配到非中括號(hào)中的任何字符;字符類“.”:匹配除了答行符和其他Unicode行符之外的所有字符;字符類“\w”:匹配任何ASCII單字字符,相當(dāng)于[a-zA-Z0-9];字符類“\W”:匹配到所有ASCII單字字符之外的字符,相當(dāng)于[^a-zA-Z0-9];字符類“\s”:匹配任何Unicode空白符,相當(dāng)于[\f\n\r\t\v\u00A0\u2028\u2029];字符類“\S”:匹配任何Unicode空白符之外的字符相當(dāng)于[^\f\n\r\t\v\u00A0\u2028\u2029];字符類“\d”:匹配任何數(shù)字,相當(dāng)于[0-9];字符類“\D”:匹配任何數(shù)字之外的字符,相當(dāng)于[^0-9]。
3、界定符
假設(shè)有一個(gè)字符串內(nèi)容為“BaaaaaBaaaaaB”,要求匹配到第一個(gè)“B”和最后一個(gè)“B”,則可以使用界定符;
界定符“^”可以匹配到一行字符的開(kāi)頭,“/^B/”可以匹配到第一個(gè)“B”;界定符“$”可以匹配到一行字符的結(jié)尾,“/B$/”可以匹配到最后一個(gè)“B”;
更多界定符:界定符“^”:匹配行首,多用于多行文本搜索;界定符“$”:匹配行尾,多用于多行文本搜索;界定符“\b”:匹配單詞的邊界,多用于英文文本;界定符“\B”:與\b相反,匹配到一個(gè)非單詞的邊界。
4、選擇符
假設(shè)要在一個(gè)字符串中查找子字符串A和子字符串B,在正則表達(dá)式中用一個(gè)選擇符“|”,使用這個(gè)選擇符可以匹配多個(gè)子字符串;例如字符串1“AAAaaaaaaaBBB”、字符串2“AAAaaaaaaa”、字符串3“BBBaaaaaaa”,使用/AAA|BBB/都可以去匹配;但是匹配字符串1的話,只會(huì)匹配到AAA,因?yàn)槌鞘褂萌帜J綐?biāo)志,在完成第一次匹配后不會(huì)再進(jìn)行后面的匹配了,包括字符和字符類以及所有的匹配方式都是這樣。
5、重復(fù)類
字符類都只能匹配一個(gè)字符,如“[0-9]”只能匹配數(shù)字0到9,如果要匹配數(shù)字10到99就不行了;正則表達(dá)式提供了重復(fù)類來(lái)匹配這種重復(fù)的現(xiàn)象;比如重復(fù)類“{n}”可以將前一項(xiàng)重復(fù)n次;
/[\d]{2}/????? 將“[\d]”重復(fù)兩次,相當(dāng)于“/[\d][\d]/”
/ab{2}/????? 將“b”重復(fù)兩次,相當(dāng)于“/abb/”
在正則表達(dá)式“/[\d]{2}/”中可以匹配到00到99之間的數(shù)字,但如果0到99之間的數(shù)字需要用“/[\d]|[\d]{2}/”
/[\d]{1,3}/????? 將“[\d]”重復(fù)1到3次,相當(dāng)于“/[\d]/”或“/[\d][\d]/”或“/[\d][\d][\d]/”
/ab{1,3}/????? 將“b”重復(fù)1到3次,相當(dāng)于“/ab/”或“/abb/”或“/abbb/”
更多重復(fù)類:1、{n}:匹配前一項(xiàng)n次;2、{n,m}:匹配前一項(xiàng)n到m次;3、{n,}:匹配前一項(xiàng)至少n次;4、?:酦醅前一項(xiàng)0次或者1次,相當(dāng)于{0,1};5、+:匹配前一項(xiàng)至少1次,相當(dāng)于{1,};6、*:匹配前一項(xiàng)0次貨多次,相當(dāng)于{0,};
6、分組
假設(shè)要匹配字符串“java”或“javascript”,除了選擇符,還可以使用小括號(hào)將字符串分組來(lái)實(shí)現(xiàn),分了組的字符串可以看成一個(gè)整體;
比如:/java(script)?/,“script”被小括號(hào)括起來(lái)視為一個(gè)整體,又因?yàn)橹貜?fù)類“?”會(huì)將整個(gè)“script”重復(fù)0次或者1次,所以可以匹配字符串“java”或“javascript”。
7、引用
在正則表達(dá)式中,會(huì)給每一個(gè)分組分配一個(gè)編號(hào),使用編號(hào)可以將匹配到的內(nèi)容在正則表達(dá)式中作進(jìn)一步的處理;編號(hào)方式為:從正則表達(dá)式左側(cè)開(kāi)始,第一個(gè)分組編號(hào)為1,第二個(gè)為2,以此類推;
分組編號(hào)后,可以使用“\n”來(lái)引用分組匹配的字符串;如“\1”位第一個(gè)分組匹配的字符串;/(java)?Script\1:,該正則表達(dá)式可以匹配到“javascriptjava”或“script”;
在某些情況下,可能要將匹配到的字符串分組,但不記錄該組匹配的字符串,那么久可以使用“(?)”符號(hào)類進(jìn)行分組,比如:/(?:java){0,1}(Script){0,1}\1/,可以匹配到“java”或“JavaScriptScript”。
8、其他匹配
正則表達(dá)式中海油兩種選擇性匹配:
x(?=y):只有x后面緊跟著y才匹配;
x(?!y):只有x后面不是y才匹配。
9、匹配規(guī)則
正則表達(dá)式在匹配字符串時(shí),只要遇上可以匹配的內(nèi)容就會(huì)停止匹配;如果想要繼續(xù)匹配的話,就必須在正則表達(dá)式后加上標(biāo)志符“g”,如/a/g;
更多標(biāo)志符:1、i:匹配時(shí)不區(qū)分大小寫;2、g:匹配能匹配的所有字符,而不是在匹配第一個(gè)后就停止匹配;3、m:執(zhí)行多行匹配模式,也就是使用“^”和“$”來(lái)匹配開(kāi)頭和結(jié)尾。