1. 正則表達式 是一個描述字元模式的對象. 1.創建方式 1) 正則表達式直接量 var pattern = /s$/; 2) RegExp()構造函數 var pattern = new RegExp("s$"); 2. 直接量字元 正則表達式中所有字母和數字都是按照字面含義進行匹配的。 字元 ...
1. 正則表達式
是一個描述字元模式的對象.
1.創建方式
1) 正則表達式直接量
var pattern = /s$/;
2) RegExp()構造函數
var pattern = new RegExp("s$");
2. 直接量字元
正則表達式中所有字母和數字都是按照字面含義進行匹配的。
字元 匹配
-----------------------
字母和數字 自身
\t 製表符
\n 換行符
\v 垂直製表符
\f 換頁符
\r 回車符
\xnn 由十六進位數nn指定的拉丁字元 \x0A => \n
\uxxxx 由十六進位xxxx指定的Unicode字元,例如 \u0009 => \t
\cX 控制字元 ^X,例如 \cJ 等價於換頁符 \n
3. 字元類
將直接量字元單獨放在方括弧內就組成了字元類。一個字元類可以匹配它所有包含的任意字元。
[...] 方括弧內的任意字元
[^...] 不在方括弧內的任意字元
特殊字元類
. 除換行符和其他Unicode行終止符之外的任意字元
\w 任何ASCII字元,等價於[a-zA-Z0-9]
\W 任何非ASCII字元組成的,等價於[^a-zA-Z0-9]
\s 任何Unicode空白符:空格,製表符,回車
\S 任何非Unicode空白符的字元
\d 任何ASCII數字,等價於 [0-9]
\D 任何非ASCII數字之外的任意字元,等價於 [^0-9]
[\b] 退格直接量(特例)
4. 重覆 一定要用在子表達式之後
{n,m} 匹配前一項至少n次,但是不超過m次
{n,} 匹配前一項n次或者更多次
{n} 匹配前一項n次
? 匹配前一項0次或者1次,等價於{0,1}
+ 匹配前一項1次或者多次,等價於{1,}
* 匹配前一項0次或者多次,等價於{0,}
例如:
/[abc]/ 匹配"a" "b" "c"中任意一個字元
/[^abc]/ 匹配"a" "b" "c"之外的任意一個字元
/\d{2,4}/ 匹配2~4個數字
/\w{3}\d?/ 匹配三個字元或和一個可選的數字
/\s+java\s+/ 匹配前後帶有一個或多個空格的字元串"java"
5. 重覆方式
貪婪重覆
匹配重覆字元時是儘可能多地匹配
非貪婪重覆
在待匹配的字元後跟隨一個問號即可: ?? +? *? {1,5}?
例如:
/a+/ 可以匹配一個或者多個連續的字母a, 當使用"aaa"作為匹配字元串時正則表達式會匹配它的三個字元
/a+?/ 可以匹配一個或者多個連續的字母a, 但是儘可能少地匹配。只能匹配第一個a
6. 選擇
使用字元 "|" 分割供選擇的字元。選擇項的嘗試匹配次序是從左到右,直到發現了匹配項,如果左邊的選擇項匹配,就忽略右邊的匹配項,即使它產生更好的匹配。/ab|cd|ef/ 可以匹配 "ab"或者"cd"或者"ef"
7. 分組
"()"作用:
1) 把單獨的項組合成子表達式
以便可以像處理一個單元那樣用"|""*""+""?"對單元內的項進行處理
/java(script)?/ 可以匹配字元串java,後面的script可以有也可以沒有
/(ab|cd)+|ef/ 可以匹配"ef",也可以匹配"ab""cd"一次或者多次
2) 在完整的模式中定義子模式
當一個正則表達式成功地和目標字元串相匹配時,可以從目標串中抽出和圓括弧中的子模式相匹配的部分。
/[a-z]+\d+/ 一個或者多個小寫字母後跟隨一個或者多個數字
(/[a-z]+(\d+)/) 可以抽出每個匹配末尾的數字
3) 在同一正則表達式後面引用前面的子表達式。
\1 引用第一個帶圓括弧的子表達式
/([Jj]ava([Ss]cript)?)\sis\s(fun\w*)/ \2 引用 ([Ss]cript)
對正則表達式中前一個子表達式的引用,並不是指對子表達式模式的引用,而是對與那個模式相匹配的文本的引用
例如:
/['"][^'"]*['"]/ 匹配單引號或者雙引號內的0個或者多個字元,但是它並不要求左側和右側的引號匹配
/(['"])[^'"]*\1/ 匹配單引號或者雙引號內的0個或者多個字元,但是它要求左側和右側的引號匹配
8. 指定匹配位置
^ 匹配字元串的開頭,在多行檢索中,匹配一行的開頭
$ 匹配字元串的結尾,在多行檢索中,匹配一行的結尾
\b 匹配一個單詞的邊界,即位於字元\w和\W之間的位置,或者位於字元\w和字元串的開頭或結尾之間的位置。
\B 匹配非單詞邊界的位置
(?=p) 零寬正向先行斷言,要求接下來的字元都與p匹配,但不能包括匹配p的那些字元
(?!p) 零寬負向先行斷言,要求接下來的字元不與p匹配
9. 修飾符
不是出現在兩條斜線之間,而是出現在第二條斜線之後。
new RegExp("","igm")
i 說明匹配模式匹配是不區分大小寫
g 說明模式匹配應該是全局的
m 用以在多行模式中執行匹配。
/java$/im 可以匹配"java",也可以匹配"java\nis fun"
2. Javascript中 String對正則表達式的支持
1. search()
參數為一個正則表達式。如果參數不為正則表達式,則先通過RegExp將其轉換為構造函數。不支持全局檢索,返回第一個與之匹配的子串的位置,如果找不到匹配的子串,返回-1。
"JavaScript".search(/script/i); //返回4
2. replace()
用以執行檢索和替換操作。第一個參數是正則表達式,第二個參數是要替換的字元串。
text.replace(/javascript/gi,"JavaScript"); //不區分大小寫將所有javascript轉換為JavaScript
3. match()
最常用的正則表達式方法,參數為正則表達式。返回由匹配結果組成的數組。
當正則表達式中沒有g修飾符的時候,就不是全局匹配。這時,數組的第一個元素就為匹配的字元串,剩餘的元素則是由正則表達式中用圓括弧括起來的子表達式。如果該正則表達式設置為修飾符g,則該方法返回的數組包含字元串中所有匹配結果。
"1 plus 2 equals 3".match(/\d+/g) //返回["1","2","3"]
var url = /(\w+):\/\/([\w.]+)\/(\S*)/;
var text = "visit my blog at http://www.briup.com/~ee";
var result = text.match(url);
if(result!=null){
var fullurl = result[0];
var protocol = result[1];
var host = result[2];
var path = result[3];
}
4. split() 方法用於把一個字元串分割成字元串數組。
語法:stringObject.split(separator(必需。字元串或正則表達式,從該參數指定的地方分割 stringObject。),howmany(可選))
返回值為一個字元串數組 參數可以為正則表達式
"1, 2, 3, 4, 5".split(/\s*,\s*/); //["1","2","3","4","5"] 允許分隔符左右兩邊留有空白
"2:3:4:5".split(":") //將返回["2", "3", "4", "5"]
"|a|b|c".split("|") //將返回["", "a", "b", "c"]
"hello".split("") //可返回 ["h", "e", "l", "l", "o"]
"hello".split("", 3) //返回一部分字元,請使用 howmany 參數 返回 ["h", "e", "l"]
3. Javascript中RegExp
1. 構造函數
第一個參數包括正則表達式的主體部分,即正則表達式直接量中兩條斜線之間的文本
第二個參數指定正則表達式的修飾符。只能傳入g ,i,m或者其組合,可以省略
var zipcode = new RegExp("/\d{5}","g");
2. 屬性
source 包含正則表達式文本
global 布爾值,表明這個正則表達式是否帶有修飾符g
ignoreCase 布爾值,表明這個正則表達式是否帶有修飾符i
multiline 布爾值,表明這個正則表達式是否帶有修飾符m
lastIndex 如果匹配模式帶有g,這個屬性存儲在整個字元串中下一次檢索的開始位置,這個屬性會被exec(), test()方法調用到
3.方法
1) exec()
與match類似。參數為字元串。對一個指定的字元串執行一個正則表達式在一個字元串中執行匹配檢索,如果沒有找到任何匹配,返回null,如果找到了匹配,返回一個數組。這個數組元素中的第一個元素包含與正則表達式相匹配的子字元串,剩餘的元素是圓括弧內的子表達式相匹配的子串。當調用的正則表達式對象具有修飾符g時,它將把當前正則表達式對象的lastIndex屬性設置為緊挨著匹配子串的字元位置,當同一個正則表達式第二次調用exec()時,它將從lastIndex屬性所指的字元處開始檢索。如果沒有匹配到任何結果將lastIndex重置為0.
var pattern = /Java/ig;
var text = "JavaScript is more fun than java_is good";
var result;
while((result = pattern.exec(text))!=null){
console.log(result[0]+" at "+result.index);
}
2) test()
參數為字元串。用test()對某個字元串進行檢測,如果包含正則表達式的一個匹配結果,返回true.調用test()和調用exec()行為等價,test()會從lastIndex指定位置處開始檢索某個字元串,如果它找到了一個匹配結果,立即設置lastIndex為當前匹配字元串的結束位置。
var pattern = /Java/ig;
var text = "JavaScript is more fun than java_is good";
var pattern.test(text); //結果 true
與test() exec()不同,String方法search() replace() match()並不會用到lastIndex屬性