1. 如何創建正則表達式?
RegExp 對象表示正則表達式,它是對字符串執行模式匹配的強大工具。
直接量語法
/pattern/attributes
何時使用:使用固定的正則表達式時
創建 RegExp 對象的語法:
new RegExp(pattern, attributes);
何時使用:如果正則表達式需要動態拼接
強調:"正則表達式"中的\都要變爲\\
參數
參數 pattern 是一個字符串,指定了正則表達式的模式或其他正則表達式。
參數 attributes 是一個可選的字符串,包含屬性 "g"、"i" 和 "m",分別用於指定全局匹配、區分大小寫的匹配和多行匹配。ECMAScript 標準化之前,不支持 m 屬性。如果 pattern 是正則表達式,而不是字符串,則必須省略該參數。
方括號
方括號用於查找某個範圍內的字符:
表達式 | 描述 |
---|---|
[abc] | 查找方括號之間的任何字符。 |
[^abc] | 查找任何不在方括號之間的字符。 |
[0-9] | 查找任何從 0 至 9 的數字。 |
[a-z] | 查找任何從小寫 a 到小寫 z 的字符。 |
[A-Z] | 查找任何從大寫 A 到大寫 Z 的字符。 |
[A-z] | 查找任何從大寫 A 到小寫 z 的字符。 |
[adgk] | 查找給定集合內的任何字符。 |
[^adgk] | 查找給定集合外的任何字符。 |
(red|blue|green) | 查找任何指定的選項。 |
元字符
元字符(Metacharacter)是擁有特殊含義的字符:
元字符 | 描述 |
---|---|
. | 查找單個字符,除了換行和行結束符。 |
\w | 查找單詞字符。 |
\W | 查找非單詞字符。 |
\d | 查找數字。 |
\D | 查找非數字字符。 |
\s | 查找空白字符。 |
\S | 查找非空白字符。 |
\b | 匹配單詞邊界。 |
\B | 匹配非單詞邊界。 |
\0 | 查找 NUL 字符。 |
\n | 查找換行符。 |
\f | 查找換頁符。 |
\r | 查找回車符。 |
\t | 查找製表符。 |
\v | 查找垂直製表符。 |
\xxx | 查找以八進制數 xxx 規定的字符。 |
\xdd | 查找以十六進制數 dd 規定的字符。 |
\uxxxx | 查找以十六進制數 xxxx 規定的 Unicode 字符。 |
量詞
量詞 | 描述 |
---|---|
n+ | 匹配任何包含至少一個 n 的字符串。 |
n* | 匹配任何包含零個或多個 n 的字符串。 |
n? | 匹配任何包含零個或一個 n 的字符串。 |
n{X} | 匹配包含 X 個 n 的序列的字符串。 |
n{X,Y} | 匹配包含 X 或 Y 個 n 的序列的字符串。 |
n{X,} | 匹配包含至少 X 個 n 的序列的字符串。 |
n$ | 匹配任何結尾爲 n 的字符串。 |
^n | 匹配任何開頭爲 n 的字符串。 |
?=n | 匹配任何其後緊接指定字符串 n 的字符串。 |
?!n | 匹配任何其後沒有緊接指定字符串 n 的字符串。 |
RegExp 對象屬性
RegExp 對象方法
方法 | 描述 | FF | IE |
---|---|---|---|
compile | 編譯正則表達式。 | 1 | 4 |
exec | 檢索字符串中指定的值。返回找到的值,並確定其位置。 | 1 | 4 |
test | 檢索字符串中指定的值。返回 true 或 false。 | 1 | 4 |
支持正則表達式的 String 對象的方法
方法 | 描述 | FF | IE |
---|---|---|---|
search | 檢索與正則表達式相匹配的值。 | 1 | 4 |
match | 找到一個或多個正則表達式的匹配。 | 1 | 4 |
replace | 替換與正則表達式匹配的子串。 | 1 | 4 |
split | 把字符串分割爲字符串數組。 |
查找:2種: 1. 只判斷是否包含關鍵字:不考慮具體內容和個數 var i=str.search(reg); 只能返回第一個找到的關鍵字的位置 找不到,返回-1 2. 獲取所有關鍵字的內容:不考慮位置 var kwords=str.match(reg); 返回所有關鍵字的內容,保存在kwords數組中 ***找不到,返回null,都要先判斷不爲null,再使用;kwords.length,如果kwords爲null,則報錯!
替換或刪除子字符串: var newStr=str.replace(reg,"替換字符"); 格式化字符串: 正則表達式中的每個(),都是一個子表達式 每個子表達式都會自動獲得一個從1開始的編號 替換時,可用$n,指代本次匹配中第n個子表達式的對應內容
<span style="background-color: rgb(204, 255, 255);"><script></span>
<span style="background-color: rgb(204, 255, 255);"><span style="white-space:pre"> </span>/*去掉字符串開頭或結尾的空字符*/
function ltrim(){//只去掉開頭的空字符
//定義正則表達式只匹配開頭的空字符,保存在reg中
//替換str中滿足reg規則的子字符串爲"", 並返回
return str.replace(/^\s+/,"");
}
function rtrim(){//只去掉結尾的空字符
//定義正則表達式只匹配結尾的空字符,保存在reg中
//替換str中滿足reg規則的子字符串爲"", 並返回
return str.replace(/\s+$/,"");
}
function trim(){//同時去掉開頭或結尾的字符
//定義正則表達式匹配開頭或結尾的空字符,保存在reg中
//替換str中滿足reg規則的子字符串爲"", 並返回
return str.replace(/^\s+|\s+$/g,"");
}
var str=" \t Hello World \t";
console.log(ltrim()); //"Hello World \t"
console.log(rtrim()); //" \t Hello World"
console.log(trim()); //"Hello World"</span>
<span style="background-color: rgb(204, 255, 255);"></script></span>
分隔字符串: var subs=str.split(reg[,count]);
var stmt="we two who and who";
var words=stmt.split(/\s+/);
console.log(words);
//遍歷words中每個單詞
for(var i=0;i<words.length;i++){
// 將當前位置的單詞的首字母改爲大寫,再拼接上剩餘字符,再保存回當前位置
words[i]=words[i][0].toUpperCase()
+words[i].slice(1);
}//(遍歷結束)將words,按" "拼接爲新句子,存回stmt中
stmt=words.join(" ");
console.log(stmt); //"We Two Who And Who"
var mail="[email protected]";
var arr=mail.split(/@/);
console.log("用戶名:"+arr[0]);
console.log("域名:"+arr[1]);
var msg="Tom@補給兵@60%#Mary@醫護兵@80%#John@特種兵@30%"
function show(){
//按#切割msg,將結果保存在roles中
var roles=msg.split(/#/);
//遍歷roles中每個角色字符串
for(var i=0;i<roles.length;i++){
// 再按@切割當前角色字符串,結果保存在arr中
var arr=roles[i].split(/@/);
// 輸出:"名 兵種 生命:值"
console.log(
arr[0]+" "+arr[1]+" 生命:"+arr[2]);
}
}
show();
/*
Tom 補給兵 生命:60%
Mary 醫護兵 生命:80%
John 特種兵 生命:30%
*/
RegExp.$n: 獲得本次匹配中第n個子表達式匹配的內容
var birth="19831226";
var reg=/(\d{4})(\d{2})(\d{2})/;
// 1 2 3
birth=birth.replace(reg,"$1年$2月$3日");
console.log(birth);
var date="20151207一下050632";
//定義正則reg
var reg=/(\d{4})(\d{2})(\d{2})([\u4e00-\u9fa5])([\u4e00-\u9fa5])(\d{2})(\d{2})(\d{2})/;
//用reg格式化date,再保存回date中
date=date.replace(reg,"$1年$2月$3日 星期$4 $5午 $6:$7:$8");
console.log(date);
//"2015年12月07日 星期一 下午 05:06:32"
貪婪模式:
在使用修飾匹配次數的特殊符號時,有幾種表示方法可以使同一個表達式能夠匹配不同的次數,比如:"{m,n}", "{m,}", "?", "*", "+",具體匹配的次數隨被匹配的字符串而定。這種重複匹配不定次數的表達式在匹配過程中,總是儘可能多的匹配。比如,針對文本 "dxxxdxxxd",舉例如下:
貪婪模式:
表達式 | 匹配結果 |
---|---|
(d)(\w+) | "\w+" 將匹配第一個 "d" 之後的所有字符 "xxxdxxxd" |
(d)(\w+)(d) | "\w+" 將匹配第一個 "d" 和最後一個 "d" 之間的所有字符 "xxxdxxx"。雖然 "\w+" 也能夠匹配上最後一個 "d",但是爲了使整個表達式匹配成功, "\w+" 可以 "讓出" 它本來能夠匹配的最後一個 "d" |
由此可見,"\w+" 在匹配的時候,總是儘可能多的匹配符合它規則的字符。 雖然第二個舉例中,它沒有匹配最後一個 "d",但那也是爲了讓整個表達式能夠匹配成功。 同理,帶 "*" 和 "{m,n}" 的表達式都是儘可能地多匹配,帶 "?" 的表達式在可匹配可不匹配的時候, 也是儘可能的 "要匹配"。這 種匹配原則就叫作 "貪婪" 模式 。
非貪婪模式: 在修飾匹配次數的特殊符號後再加上一個 "?" 號,則可以使匹配次數不定的表達式儘可能少的匹配,使可匹配可不匹配的表達式,儘可能的 "不匹配"。這種匹配原則叫作 "非貪婪" 模式,也叫作 "勉強" 模式。如果少匹配就會導致整個表達式匹配失敗的時候,與貪婪模式類似,非貪婪模式會最小限度的再匹配一些,以使整個表達式匹配成功。舉例如下,針對文本 "dxxxdxxxd" 舉例:
表達式 | 匹配結果 |
---|---|
(d)(\w+?) | "\w+?" 將儘可能少的匹配第一個 "d" 之後的字符,結果是:"\w+?" 只匹配了一個 "x" |
(d)(\w+?)(d) | 爲了讓整個表達式匹配成功,"\w+?" 不得不匹配 "xxx" 纔可以讓後邊的 "d" 匹配,從而使整個表達式匹配成功。因此,結果是:"\w+?" 匹配 "xxx" |
更多的情況,舉例如下: 舉例1:表達式 "<td>(.*)</td>" 與字符串 "<td><p>aa</p></td> <td><p>bb</p></td>" 匹配時,匹配的結果是:成功;匹配到的內容是 "<td><p>aa</p></td> <td><p>bb</p></td>" 整個字符串, 表達式中的 "</td>" 將與字符串中最後一個 "</td>" 匹配。 舉例2:相比之下,表達式 "<td>(.*?)</td>" 匹配舉例1中同樣的字符串時,將只得到 "<td><p>aa</p></td>", 再次匹配下一個時,可以得到第二個 "<td><p>bb</p></td>"。