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