Javascript中使用RegExp的簡略指南

2018-06-09 18:06 更新

前言

RegExp是Javascript中的一個(gè)內(nèi)置對象。使用它可以在javascript中進(jìn)行一些正則方面的操作。本文打不打算詳細(xì)的介紹RegExp的具體內(nèi)容,比如子匹配、分組、惰性匹配等等這些內(nèi)容的具體用法。本文僅從實(shí)用的角度來闡述regexp在javascript中的一些常用以及基本方法。關(guān)于RegExp的具體文檔,可參閱w3school或者MDN。

創(chuàng)建

在Javascript中有兩種方式來創(chuàng)建一個(gè)regexp。一種是使用new RegExp(pattern[, flags]),另一種是使用/pattern/[flags]。前者創(chuàng)建了一個(gè)regexp對象,后者是一個(gè)對象字面量。

這里有兩點(diǎn)稍微提一下,

  • 使用第一種方式時(shí),我們可以傳遞一個(gè)字符串,也可以傳遞一個(gè)正則字面量。
  • 使用字符串創(chuàng)建regexp對象時(shí),注意元字符的轉(zhuǎn)義。

下面是幾個(gè)例子,

var reg1 = /ab+c/i;
var reg2 = new RegExp('ab+c', 'i');
var reg3 = new RegExp(/ab+c/, 'i');
var reg4 = /\w+/;
var reg5 = new RegExp('\\w+');

方法

在Javascript中,跟regexp對象關(guān)聯(lián)最為密切的一般都是String對象。支持regexp的String方法有如下幾個(gè),

方法 說明
search 檢索與正則表達(dá)式相匹配的值
match 找到一個(gè)或多個(gè)正則表達(dá)式的匹配
replace 替換與正則表達(dá)式匹配的子串
split 把字符串分割為字符串?dāng)?shù)組

上面的4個(gè)方法都可以使用regexp作為參數(shù),而且根據(jù)傳入的regexp可能返回的結(jié)果會有很大的不同。

除此之外,regexp對象本身也有一些方法,他們是,

方法 說明
compile 編譯正則表達(dá)式
exec 檢索字符串中指定的值。返回找到的值,并確定其位置。
test 檢索字符串中指定的值。返回 true 或 false。

關(guān)于各個(gè)方法在javascript中的具體使用示例,請繼續(xù)往下看????

示例

下面,我將會使用一系列的真實(shí)示例來闡述regexp以及相關(guān)方法的用法。

// 測試`test`方法
var reg = /he/;
reg.test('hehe'); // true
reg.test('boy'); // false
reg.test('HEHE'); // false 因?yàn)閞egexp默認(rèn)是大小寫敏感的
var reg2 = /he/i;
reg2.test('HEHE'); // true
reg2.test('I am a good boy, and she is a bad girl.'); // true 只要被匹配的字符串中包含he(HE、hE、He)即可。
var reg3 = /^he/i;
reg3.test('She is a good girl'); // false 因?yàn)閔e不是字符串的首部。
var reg4 = /he$/i;
reg4.test('She loves he'); // true 因?yàn)閔e是字符串的尾部。
var reg5 = /^he$/i;
reg5.test('he'); // true 因?yàn)樽址且詇開始,以e結(jié)束,且中間沒有任何其他字符。
var reg6 = /\s/; // 元字符`\s`匹配任何空白字符,包括空格、制表符、換頁符等等  
reg6.test('ge jiawen'); // 字符串中有空格
var reg7 = /^[a-z]/; // 元字符`[]`匹配指定范圍內(nèi)的任意字符
reg6.test('good123'); // true 字符串中必須要是以字母開頭
// 僅僅知道了字符串是否匹配模式還不夠,我們還需要知道哪些字符匹配了模式
var reg8 = /^[a-z]+\s+\d+$/i; // 量詞`+`,表示至少匹配一次
reg8.test('Ubuntu 8'); // true 因?yàn)槠ヅ涞搅税姹咎?// 我們使用regexp的exec方法,返回一個(gè)數(shù)組,第一個(gè)元素為匹配的內(nèi)容,后續(xù)的數(shù)組元素為子匹配的內(nèi)容(如果有子匹配的話)
var ret = reg8.exec('Ubuntu 8');
console.log(ret[0]); // ['Ubuntu 8']
// 提取匹配內(nèi)容中的數(shù)字
var reg9 = /\d+/;
reg9.exec(reg8.exec('Ubuntu 8')); // ['8']
// 要提取'Ubuntu 8'中的數(shù)字,我們還是使用子匹配
var reg10 = /^[a-z]+\s+(\d+)/i; // 一般我們使用`()`來設(shè)定一個(gè)子匹配(或者叫匹配分組)
reg10.exec('Ubuntu 8'); // ['Ubuntu 8', '8']
// 可以設(shè)定多個(gè)子匹配
var reg11 = /^[a-z]+\s+(\d+)\.(\d+)$/i;
reg11.exec('Ubuntu 14.04'); // ['Ubuntu 14.04', '14', '04']
// 使用replace,進(jìn)行字符串替換
var str = 'some money';
str.replace('some', 'much'); // much money
str.replace(/\s+/, '%'); // much%money
// 使用regexp的全局匹配標(biāo)志,進(jìn)行多次匹配。
// 如果不進(jìn)行全局匹配,那么regexp將在匹配成功一次后終止匹配。反之則匹配整個(gè)字符串。
var str2 = 'some      money'; // 包含了多個(gè)空格字符
str2.replace(/\s/, '%'); // some%   money
str2.replace(/\s/g, '%'); // some%%%%money
// split方法使用regexp。
// 在`[]`中使用`^`表示范圍取反。
var str3 = 'a_bc-d=e--f';
str3.split(/[^a-z]+/g); // ["a", "bc", "d", "e", "f"]
// search使用regexp。
var str4 = 'My age is 25 age.';
str4.search(/\d+/); // 10,表示匹配字符串的開始位置。如果沒有匹配到則為-1
// 使用match方法。
var str5 = 'My name is Larry. Hello everyone.';
str5.match(/[A-Z]/); // ['M'] 因?yàn)槲覀儧]有全局匹配。所以匹配成功一次就終止了
str5.match(/[A-Z]/g); // ["M", "L", "H"]
str5.match(/\b[a-z]\b/ig); // ["My", "name", "is", "Larry", "Hello", "everyone"] 匹配所有的單詞
str5.match(/\b[a-z]{2}\b/ig); // ["My", "is"] 匹配所有2個(gè)字符的單詞
// 捕獲分組與非捕獲分組。
// 捕獲分組將`(abc)`中的`abc`匹配內(nèi)容也放到結(jié)果數(shù)組中。而非捕獲分組則不會。
/(abc){2}/.exec('abcabc'); // ["abcabc", "abc"]
/(?:abc){2}/.exec('abcabcabc') // ["abcabc"]
// 候選,也就是‘或者’的意思
/^a|c$/.test('asssc'); // true 因?yàn)閷⑵ヅ溟_始的字符a,或者結(jié)束位置的c
/^(a|bc)$/.test('abc') // false 因?yàn)槠ヅ涞淖址仨毷莂或者bc
// 分組與反向引用。
// `test`,`match`等方法對包含分組的regexp進(jìn)行操作時(shí),會將分組存儲起來,通過反向引用可以拿到分組。
var reg = /(A?(B?(C?)))/;
reg.test('ABC'); // 反向引用被存儲在RegExp對象的靜態(tài)屬性$1—$9中  
console.log(RegExp.$1 + ", " + RegExp.$2 + ", " + RegExp.$3); // ABC, BC, C
var reg2 = /\d+(\D)\d+\1\d+/; // 在regexp中可以使用`\1`來反向引用匹配到的分組
'2008-1-1'.test(reg2); // true
'2008-1_1'.test(reg2); // false
var reg3 = /(\d)\s(\d)/;
'1234 5678'.replace(reg3, '$2 $1'); // '5678 1234'
// 正向前瞻(?=)與負(fù)向前瞻(?!)
// 正則表達(dá)式引擎在運(yùn)行正向前瞻或者負(fù)向前瞻時(shí),正則表達(dá)式引擎會留意字符串后面的部分,然后卻不會真實(shí)的移動匹配指針index。
// 示例:如果我要匹配一個(gè)后面跟一個(gè)數(shù)字的單詞,但是僅僅返回這個(gè)單詞不包括數(shù)字。
var reg = /[a-z]+(?=\d+)/;
var str = 'I am a good2 boy.';
str.match(reg); // ['good']
// 示例:如果我要匹配一個(gè)后面不跟一個(gè)數(shù)字的單詞,但是僅僅返回這個(gè)單詞不包括數(shù)字。
var reg = /[a-z]+(?!\d+)\b/g;
var str = 'one1 two2 three four4';
str.match(reg); // ["three"]

以上代碼塊中的內(nèi)容基本上就是javascript中使用regexp的方方面面了。掌握這些方法,在編寫javascript代碼時(shí),特別是針對一些字符串進(jìn)行處理時(shí),使用regexp往往會具有很高的效率。不過,javascript中的regexp僅僅涵蓋了正則表達(dá)式的基本及常見用法。要想了解更多更詳細(xì)的內(nèi)容,可以參閱相關(guān)專門講述正則表達(dá)式的書籍。

參考列表



以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號