正規表示式基本概念

UCCs發表於2018-04-21

引用文字

什麼是正規表示式

正規表示式是一個描述字元模式的物件。主要用來驗證客戶端的輸入資料,使用者填寫完表單資訊提交後,就會傳遞給後臺伺服器,伺服器會通過PHP等後臺指令碼進行處理,因為客戶端驗證,節約了大量的伺服器資源,並提供了良好的使用者體驗。

建立正規表示式

建立正規表示式有兩種方法:

  1. 使用RegExp構建函式接收兩個引數:一個是要匹配的字串,一個是模式修飾符(可選)
    var pattern = new RegExp(`box`);
  2. 字面量方式建立,直接使用兩個斜槓。在第二個斜槓後面加上模式修飾符(可選)
    var pattern = /box/ flags; //兩個斜槓和box之間不能有空格

模式修飾符的可選引數:

引數 含義
g 全域性模式(global)
i 不區分大小寫(case-insensitive)
m 多行模式(multiline)

測試正規表示式

exct() 接收一個引數,該引數和模式匹配,把模式作為陣列返回;未匹配到返回null
test() 接收一個引數,該引數和模式匹配,返回true,否則返回false

使用字串的正規表示式方法

String物件中的正規表示式方法:

方法 含義
match(pattern) 返回匹配到模式中的字串或null
replace(pattern,replacement) replacement替換pattern
search(pattern) 返回字串中pattern開始的位置
split(pattern) 返回用空格拆分的陣列

例:

var pattern = /box/ig;
var str = "This is Box! This is Box!";
alert(str.match(pattern));        //Box Box

開啟全域性模式,將所有匹配的字串組合成陣列;
未開啟全域性模式,匹配到第一個字串就返回。

var pattern = /box/ig;
var str = "This is Box! This is Box!";
alert(str.replace(pattern,`Tom`));    //This is Box! This is Box!

開啟全域性模式,將匹配到的字串全部替換掉;
未開啟全域性模式,只替換掉第一個查詢到的字串。

var pattern = /box/i;
var str = "This is Box! This is Box!";
alert(str.search(pattern));        //8

查詢返回的位置:查到返回對應的位置,未查到返回-1;無需全域性模式。

var pattern = / /i;
var str = "This is Box! This is Box!";
alert(str.split(pattern));

返回用空格拆分的陣列

RegExp物件的靜態屬性:

屬性 短名 含義
input $_ 當前被匹配的字串
lastMatch $& 最後一個匹配字串
lastParen $+ 最後一對圓括號內的匹配子串
leftContext $` 最後一次匹配前的字串
multiline $* 用於指定是否所有的表示式都用於多行的,返回布林值
rightContext $` 最後一次匹配之後的字串

所有的屬性都可以用短名來操作,其中$_可以用點表示法來操作,其他都不可以。

正規表示式元字元是包含特殊含義的字元,可以控制匹配模式的方式。反斜槓後的元字元將失去其含義。

獲取控制

字元類:單個字元和數字

元字元/元符號 匹配情況
. 匹配除換行符號外的任意字元
[a-zA-Z0-9] 匹配方括號中任意字元
1 匹配不是方括號中任意字元
d 匹配任意數字和[0-9]相同
D 匹配非數字和2相同1
w 匹配字母和數字及_
W 匹配非字母和數字及_

字元類:空白字元

元字元/元符號 匹配情況
0 匹配null字元
b 匹配空格字元
f 匹配進紙字元
n 匹配換行符
r 匹配回車字元
t 匹配製表符
s 匹配空白字元、空格、製表符和換行符
S 匹配非空白字元

字元類:替代字元

元字元/元符號 匹配情況
this where logo 匹配 this 或 where 或 logo 中任意一個,` `必須用分組符號包含起來

字元類:錨字元

元字元/元符號 匹配情況
^ 行首匹配
$ 行尾匹配
A 只有匹配字串開始處
b 匹配單詞邊界,詞在[]內時無效
B 匹配非單詞邊界
G 匹配當前搜尋的開始位置
Z 匹配字串結束處或行尾
z 只匹配字串結束處

字元類:重複字元

元字元/元符號 匹配情況
x? 匹配0個或1個x
x* 匹配0個或1個或多個x
x+ 匹配1個或多個x
(xyz)+ 匹配至少一個(xyz)
x{m,n} 匹配最少m個、最多n個x

字元類:替代字元

元字元/元符號 匹配情況
(string) 分組表示一個字元,用圓括號表示
1 或$1 匹配第一個分組中的內容
2 或$2 匹配第二個分組中的內容
3 或$3 匹配第三個分組中的內容

貪婪和惰性(非貪婪)

貪婪是儘可能多的匹配內容,惰性(非貪婪)這是儘可能少的匹配內容
貪婪是從結尾開始匹配,惰性(非貪婪)是從開頭開始匹配

貪婪 惰性
+ +?
??
* *?
{n} {n}?
{n,} {n,}?
{n,m} {n,m}?

下面例子匹配8和8中的內容,把他替換成QQ

var pattern = /8(.+?)8/g; 
var str = `This is 8google8, That is 8google8, There is 8google8`;
var result = str.replace(pattern,`QQ`);
document.write(result);        

輸出結果:This is QQ, That is QQ, There is QQ

錯誤匹配:8google, That is 8換成QQ,google不變,8, There is 8替換成QQgoogle8不變,就是我們看到的結果。

var pattern = /8(.+?)8/g; 
var str = `This is 8google, That is 8google8, There is 8google8`;
var result = str.replace(pattern,`QQ`);
document.write(result);        

輸出結果:This is QQgoogleQQgoogle8

錯誤匹配:8google8換成QQ,google不變,8, That is 8替換成QQgoogle不變,8, There is 8替換成QQgoogle8不變,就是我們看到的結果。

var pattern = /8(.+?)8/g; 
var str = `This is 8google8google8, That is 8google8, There is 8google8`;
var result = str.replace(pattern,`>QQ`);
document.write(result);        

輸出結果:This is QQgoogleQQgoogleQQgoogle8

  1. a-zA-Z0-9
  2. 0-9

相關文章