正規表示式
正規表示式 Regular Expression 是一種表達文字模式的方法 類似字串的模板 通常用來按照"給定模式"匹配文字
新建正規表示式有兩種方式:
字面量方式 以斜槓表示開始和結束
var regexp=/abc/;
另一種是使用RegExp建構函式
var regexp=new RegExp('abc');
RegExp建構函式還可以接受第二個引數,表示修飾符
var regex = new RegExp('xyz', 'i');
// 等價於
var regex = /xyz/i;
例項方法
RegExp.prototype.test()
正則例項物件的test方法返回一個布林值 表示當前模式是否能匹配引數字串
/react/.test('react and vue'); //true
上面程式碼驗證引數字串中是否包含react 結果返回true
RegExp.prototype.exec()
正則實力物件的exec方法 用來返回匹配結果 如果匹配 則返回一個陣列 成員是匹配成功的子字串 否則返回null
var s='x_y_z';
var r1=/x/;
var r2=/a/;
var r3=/xy/;
r1.exec(s) //[ 'x', index: 0, input: 'x_y_z' ]
r2.exec(s) // null
r3.exec(s) // null
exec方法的返回陣列還包含以下兩個屬性:
input:整個原字串。
index:整個模式匹配成功的開始位置(從0開始計數)。
var r=/a(b+)a/;
var arr=r.exec('_abbba_aba_');
console.log(arr) //['abbba','bbb']
console.log(arr.index) // 1 從字串的第二個位置開始匹配成功
console.log(arr.input) //'_abbba_aba_'
如果正規表示式加上g修飾符 賊可以多次使用exec方法 下一次搜尋的位置從上一次匹配成功結束的位置開始
var reg=/a/g;
var str='abc_abc_abc';
var r1=reg.exec(str);
console.log(r1); //[ 'a', index: 0, input: 'abc_abc_abc' ]
var r2=reg.exec(str);
console.log(r2) // [ 'a', index: 4, input: 'abc_abc_abc' ]
var r3=reg.exec(str);
console.log(r3); //[ 'a', index: 8, input: 'abc_abc_abc' ]
匹配規則
特殊字元
正規表示式對一些不能列印的特殊字元,提供了表達方法
n 匹配換行鍵;
r 匹配Enter鍵;
t 匹配製表符 ;
v 匹配垂直製表符;
f 匹配換頁符;
0 匹配null字元;
xhh 匹配一個以兩位十六進位制數(x00-xFF)表示的字元;
uhhhh 匹配一個以四位十六進位制數(u0000-uFFFF)表示的 Unicode 字元;
字元類
字元類表示有一系列字元可供選擇,只要匹配其中一個就可以了。所有可供選擇的字元都放在方括號內
/[abc]/.test('hello') //false 不包含a、b、c這三個字母中的任一個,所以返回false
/[abc]/.test('apple') //true 包含字母a,所以返回true
脫字元:
如果方括號內的第一個字元是[^],則表示除了字元類之中的字元,其他字元都可以匹配
/[^abc]/.test('hello') //true
/[^abc]/.test('bbbc') //false
連字元:
對於連續序列的字元,連字元(-)用來提供簡寫形式,表示字元的連續範圍
/a-z/.test('b') // false 連字元不出現在方括號之中,就不具備簡寫的作用,只代表字面的含義,所以不匹配字元b
/[a-z]/.test('b') // true
重複類
精確匹配次數,使用大括號({})表示
{n}表示恰好重複n次,{n,}表示至少重複n次,{n,m}表示重複不少於n次,不多於m次
/Ro{2}kie/.test('Rookie') // true 指定o連續出現2次
/Ro{2,5}kie/.test('Rooookie') // true 指定o連續出現2次到5次之間
? 問號表示某個模式出現0次或1次,等同於{0, 1}。
* 星號表示某個模式出現0次或多次,等同於{0,}。
+ 加號表示某個模式出現1次或多次,等同於{1,}。
修飾符
表示模式的附加規則,放在正則模式的最尾部。
修飾符可以單個使用,也可以多個一起使用。
g修飾符:
g修飾符表示全域性匹配(global),加上它以後,正則物件將匹配全部符合條件的結果,主要用於搜尋和替換。
var regex = /b/;
var str = 'abba';
regex.test(str); // true
regex.test(str); // true
regex.test(str); // true
正則模式不含g修飾符,每次都是從字串頭部開始匹配。所以,連續做了三次匹配,都返回true
var regex = /b/g;
var str = 'abba';
regex.test(str); // true
regex.test(str); // true
regex.test(str); // false
正則模式含有g修飾符,每次都是從上一次匹配成功處,開始向後匹配。因為字串abba只有兩個b,所以前兩次匹配結果為true,第三次匹配結果為false
i修飾符:
預設情況下,正則物件區分字母的大小寫,加上i修飾符以後表示忽略大小寫
/abc/.test('ABC') // false
/abc/i.test('ABC') // true
//加了i修飾符以後,不考慮大小寫,所以模式abc匹配字串ABC
m修飾符:
m修飾符表示多行模式
會修改^和$的行為
字串的方法
String.prototype.toLowerCase(),String.prototype.toUpperCase()
toLowerCase方法用於將一個字串全部轉為小寫,toUpperCase則是全部轉為大寫。它們都返回一個新字串,不改變原字串
'Hello World'.toLowerCase()
// "hello world"
'Hello World'.toUpperCase()
// "HELLO WORLD"
String.prototype.charAt()
charAt方法返回指定位置的字元,引數是從0開始編號的位置
var s = new String('abc');
s.charAt(1) // "b"
s.charAt(s.length - 1) // "c"
String.prototype.charCodeAt()
charCodeAt方法返回字串指定位置的 Unicode 碼
'abc'.charCodeAt(1) // 98
String.prototype.indexOf(),String.prototype.lastIndexOf()
indexOf方法用於確定一個字串在另一個字串中第一次出現的位置,返回結果是匹配開始的位置。如果返回-1,就表示不匹配
indexOf方法還可以接受第二個引數,表示從該位置開始向後匹配。
'hello world'.indexOf('o', 6) // 7
lastIndexOf方法的用法跟indexOf方法一致,主要的區別是lastIndexOf從尾部開始匹配,indexOf則是從頭部開始匹配。
'hello world'.lastIndexOf('o') // 7
String.prototype.slice()
slice方法用於從原字串取出子字串並返回,不改變原字串。它的第一個引數是子字串的開始位置,第二個引數是子字串的結束位置(不含該位置)
'JavaScript'.slice(0, 4) // "Java"
如果引數是負值,表示從結尾開始倒數計算的位置,即該負值加上字串長度
'JavaScript'.slice(-6) // "Script"
String.prototype.substr()
substr方法用於從原字串取出子字串並返回,不改變原字串,跟slice和substring方法的作用相同。
substr方法的第一個引數是子字串的開始位置(從0開始計算),第二個引數是子字串的長度。
'JavaScript'.substr(4, 6) // "Script"
如果第一個引數是負數,表示倒數計算的字元位置。如果第二個引數是負數,將被自動轉為0,因此會返回空字串。
'JavaScript'.substr(4, -1) // ""
String.prototype.substring()
substring方法用於從原字串取出子字串並返回,不改變原字串,跟slice方法很相像。它的第一個參數列示子字串的開始位置,第二個位置表示結束位置(返回結果不含該位置)
'JavaScript'.substring(0, 4) // "Java"
String.prototype.split()
split方法按照給定規則分割字串,返回一個由分割出來的子字串組成的陣列。
'a|b|c'.split('|') // ["a", "b", "c"]
surprise
讓一個字串反轉
var str='abcde';
var arr=str.split("");
console.log(arr) //[ 'a', 'b', 'c', 'd', 'e' ]
var arr2=arr.reverse();
console.log(arr2) //[ 'e', 'd', 'c', 'b', 'a' ]
vvar str2=arr.toString();
console.log(str2); //e,d,c,b,a