js正則表達式的模式匹配

一.正則表達式的定義

1.正則表達式(regular expression)是一個描述字符模式的對象.
2.RegExp對象更多的是經過一種特殊的直接量語法來建立.javascript

var reg = /\d/;

3.正則表達式的模式規則是由一個字符序列組成的,包括全部字母和數字在內,大多數的字符都是按照
直接量僅描述待匹配字符的.java

二.直接量字符

1.正則表達式中的全部字母和數字都是按照字面含義進行匹配的,
也支持非字母的字符匹配,須要經過反斜槓()做爲前綴進行轉義.好比/n/用以匹配換行符.正則表達式

var str = 'abc12345';
// 直接量字符
var reg = /b/;
console.log(str.match(reg));    // ['b', 1]

三.字符類

1.將直接量字符單獨放進方括號內就組成了字符類.
一個字符類能夠匹配它所包含的任意字符,/[abc]/就和字母'a','b','c'中的任意一個都匹配.
2.另外,能夠經過^符號來定義否認字符類,它匹配全部不包含在方括號內的字符.
3.字符類可使用連字符來表示字符範圍,/[a-z]/,[a-zA-Z0-9].
4.因爲某些字符類很是經常使用,所以在js的正則表達式語法中,使用了這些特殊字符的轉義字符來表示他們.
5.在方括號內也能夠寫這些特殊轉義字符,/[sd]/就匹配任意空白符或者數字express

// 字符類
var reg = /[bc]/;
console.log(str.match(reg));    // ['b', 1]
var reg = /[^bc][^bc]/;
console.log(str.match(reg));
var reg = /\d/g;
console.log(reg.test(str)); // true
console.log(str.match(reg)); // [1,2,3,4,5]

[...] 方括號內的任意字符
1 不在方括號內的任意字符
. 除換行符和其餘Unicode行終止符以外的任意字符
w [a-zA-Z0-9]
W 2
s 任何Unicode空白符
S 任何非Unicode空白符的字符
d [0-9]
D 3數組

var reg = /\s/g;
console.log(str.replace(reg, ''));

四.重複

1.這些正則表達式語法中較爲複雜的模式都提到了正則表達式中某元素的'重複出現次數'.
2.咱們在正則模式以後跟隨用以指定字符重複的標記.
3.在使用'*'和'?'時要注意,因爲這些字符可能匹配0個字符,所以他們容許什麼都不匹配.
{n,m} 匹配前一項至少n次,但不能超過m次
{n,} 匹配前一項n次或者更屢次
{n} 匹配前一項n次
? 匹配前一項0次或屢次,也便是說前一項是可選的,等價於{0,1}函數

  • 匹配前一項1次或屢次,等價於{1,}
  • 匹配前一項0次或屢次,等價於{0,}
// 重複
var reg = /\d{2}/;
console.log(str.match(reg));    // ['12']

var reg = /\d{2,}/;
console.log(str.match(reg));    // ['12345']

var reg = /\d{2,4}/;
console.log(str.match(reg));    // ['1234']

//郵箱 1006894640@qq.com
var str = '1006894640@qq.com.cn';
var reg = /\w+@\w+(\.\w+)+/;
console.log(str.match(reg));

四.非貪婪的重複

1.上面列出的匹配重複時儘量多的匹配,並且容許後續的正則表達式繼續匹配,所以,咱們稱之爲'貪婪的匹配'.
2.咱們一樣可使用正則表達式進行非貪婪匹配,只需在待匹配的字符後跟隨一個問號便可.'??','+?','*?'或'{1,5}+'.
3.好比,/a+/能夠匹配一個或多個連續的字母a,當使用'aaa'做爲匹配字符串時,正則表達式會匹配它的三個字符.
可是/a+?也能夠匹配一個或多個連續字母a,可是它儘量少的匹配.url

// 非貪婪的匹配
var str = 'aaab';
var reg1 = /a+/;
var reg2 = /a+?/;
console.log(str.match(reg1));   // ['aaa']
console.log(str.match(reg2));   // ['a']

五.選擇,分組和引用

1.正則表達式的語法還包括指定選擇項,子表達式分組和引用前一子表達式的特殊字符.
字符'|'用於分隔供選擇的字符,例如/ab|cd|ef/能夠匹配字符串'ab',也能夠匹配字符串'cd','ef'.
2.正則表達式中的圓括號有多種做用,一個做用是把單獨的項組合成子表達式,以即可以像處理一個獨立的
單元那樣用'|','*','+','?'等來對單元內的項進行處理.code

// 分組,引用
var str = 'javascript';
var reg1 = /java(script)?/;
console.log(str.match(reg1));   // ['javascript', 'script']

var str = 'abc123';``
var reg = /\w+(\d+)/;
console.log(str.match(reg));    // ['abc123', '3']

六.指定匹配位置

1.正則表達式中的多個元素才能匹配字符串的一個字符,例如s匹配的只是一個空白符,
還有一些正則表達式的元素匹配的是字符之間的位置,而不是實際的字符,例如b匹配一個單詞的邊界,即位於w和W之間的邊界.
2.像b這樣的元素不匹配某個可見的字符,它們指定匹配發生的合法位置.
有時咱們稱這些元素爲正則表達式的錨,由於他們將模式定位在搜索字符串的特定位置上.
最經常使用的錨元素是^,它用來匹配字符串的開始,錨元素$用以匹配字符串的結束.
^ 匹配字符串的開頭,在多行檢索中,匹配一行的開頭
$ 匹配字符串的結尾,在多行檢索中,匹配一行的結尾
b 匹配一個單詞的邊界,簡言之,就是位於字符w和W之間的位置,或位於字符s和字符串的開頭或結尾之間的位置
B 匹配非單詞邊界的位置對象

// 匹配非單詞邊界
var str1 = 'javascript';
var str2 = 'scripting';
var reg1 = /\bscript/;
var reg2 = /\Bscript/;
console.log(str1.match(reg1));  // null
console.log(str1.match(reg2));  // ['script']
console.log(str2.match(reg1));  // ['script']
console.log(str2.match(reg2));  // null

七.修飾符

1.正則表達式的修飾符,用以說明高級匹配模式的規則.
'i'用以說明模式匹配是不區分大小寫的
'g'說明模式匹配應該是全局的,也就是說,應該找出被檢索字符串中全部的匹配blog

// 修飾符
var str = 'AAaa';
var reg = /a/;
console.log(str.match(reg));    // ['a']
var reg = /a/g;
console.log(str.match(reg));    // ['a','a']
var reg = /a/i;
console.log(str.match(reg));    // ['A']
var reg = /a/gi;
console.log(str.match(reg));    // ['A', 'A', 'a', 'a']

用於模式匹配的String方法

String對象的一些用以執行正則表達式模式匹配和檢索替換操做的方法

String.search

1.search(),他的參數是一個正則表達式,返回一個與之匹配的字串的起始位置,若是找不到匹配的字串,它將返回-1.

var str = 'javascript123';
var reg = /script/i;
console.log(str.search(reg));   // 4

String.replace

1.replace()方法用以執行檢索與替換操做,其中一個參數是一個正則表達式,第二個參數是要進行替換的字符串.
若是正則表達式中設置了修飾符g,那麼源字符串中全部模式匹配的字串都將替換成第二個參數指定的字符串,
若是不帶修飾符g,則只替換所匹配的第一個字串.
2.正則表達式中使用圓括號括起來的子表達式是帶有從左到右的索引編號的,並且正則表達式會記憶與每一個子表達式匹配的文本.
若是在替換字符串中出現了$加數字,那麼replace()將用與指定的子表達式相匹配的文原本替換這兩個字符.
3.replace()方法還有一些其餘重要特性,第二個參數能夠是函數,該函數可以動態的計算替換字符串.

var reg = /j(ava)sc(ri)pt/g;
console.log(str.replace(reg, '$1'));    // 'ava'
console.log(str.replace(reg, '$2'));    // 'ri'
console.log(str);   // 'javscript',原字符串保持不變,字符串永遠不會變化,除非另外賦值.

var str2 = str.replace(reg, (a, b, c, d, e) => {
    console.log(a); // 'javascript' 匹配字符串
    console.log(b); // 'ava'    $1
    console.log(c); // 'ri'     $2
    console.log(d); // 0    匹配位置
    console.log(e);
    return 1;  // 匹配結果
});
console.log(str2);  // 1

String.match

1.match()方法是最經常使用的String正則表達式方法.它的惟一參數就是一個正則表達式,返回的是一個由匹配結果組成的數組.
若是該正則表達式設置了修飾符g,則該方法返回的數組包含字符串中的全部匹配結果.

// match
var str = 'javascriptjava';
var reg = /java/;
console.log(str.match(reg));   // ['java', 0]

var text = 'Visit my blog at http://www.example.com/~david';
var url = /(\w+):\/\/([\w.]+)\/(\S*)/;
var result = text.match(url);
console.log(result);
console.log(result.length); // 4
for (var i = 0; i < result.length; i++) {
    console.log(result[i]); // 'http://www.example.com/~david',http,'www.example.com','~david'
}

String.split

split()用以將調用它的字符串拆分爲一個子串組成的數組,使用的分隔符是split()參數.
split()方法的參數能夠是一個正則表達式,這使得split()方法異常強大.

// split
var str = 'abcde';
console.log(str.split('c')); // ['ab', 'de']

// 能夠指定分隔符,容許兩邊能夠留有任意多的空白字符
var str = '1,  2,3, 4,    5';
console.log(str.split(/\s*,\s*/));  // [1, 2, 3, 4, 5]

RegEXP對象

RegExp對象定義了兩個用於執行模式匹配操做的方法.
exec()方法與match()相似,只是RegExp方法的參數是一個字符串,而String方法的參數是一個RegExp對象.
另一個RegExp方法是test(),它的參數是一個字符串,用test()對某個字符串進行檢測,若是包含正則表達式的一個匹配結果,則返回true.


  1. ...
  2. a-zA-Z0-9
  3. 0-9
相關文章
相關標籤/搜索