JS助記 ----- 正規表示式

k909397116發表於2020-11-22

正規表示式的建立


一個完整的正規表示式包含 pattern(模式) 和 modifiers(修飾符),形如:/模式/修飾符

var reg = /abc/g; // 表示在全域性去匹配 'abc' 這個子串

修飾符


  • i 表示忽略大小寫的匹配模式
  • g 表示全域性匹配模式

基本用法


// 全域性匹配 'a' 或 'b' 或 'c' 這幾個字元
var reg = /a|b|c/g;
var reg = /[abc]/;
reg.test('defa'); // 返回 true,因為 'defa' 符合該正規表示式

// 忽略大小寫並全域性匹配 'aBc' 或 'def' 這兩個字串
var reg = /aBc|def/ig;

// 轉義字元的使用
var reg1 = /\\/g; // 判斷是否有 '\'
var reg2 = /\+/g; // 判斷是否有 '+'
var reg3 = /\*/g; // 判斷是否有 '*'

方括號的使用


// 忽略大小寫全域性匹配方括號內的字元
var reg = /[123abc]/ig; // 只要原字串包含其中的某個字元就會匹配上

// 檢查原字串中是否包含數字,匹配所有的數字字元
var reg = /[0-9]/g;

// 檢查原字串中是否包含字母,匹配所有的字母字元
var reg = /[A-z]/g; // 忽略大小寫
var reg = /[a-z]/ig;

// 檢查原字串中是否包含字母或數字,匹配所有的數字和字母字元
var reg = /[A-z0-9]/g;

// 檢查原字串中是否包含中文字元,匹配所有的中文字元
var reg = /[\u4e00-\u9fa5]/g; // 4e00 到 9fa5 是中文的 Unicode 碼

// 檢查原字串中是否不包含方括號內的字元,匹配除了放括號內的字元外所有字元
var reg = /[^abc]/g;

量詞的使用


// 是否包含連續出現3次的a字串,匹配字串中 'aaa' 子串
var reg = /a{3}/g;

// 是否包含連續出現 1~3 次的 'abc' 字串
var reg = /(abc){1,3}/g;

// 是否包含連續3個以上的字母字元,匹配字串至少包含3個
var reg = /[A-z]{3,}/g;

// n+ 表示 n{1,}
// n* 表示 n{0,}
// n? 表示 n{0,1}

// 是否以'123'開頭
var reg = /^(123)/g;

// 是否以'123'結尾
var reg = /(123)$/g;

// 檢測一個字串是否為合法手機號
// 首位為1,第二位為3-9,後9位為0-9
var reg = /^1[3-9][0-9]{9}$/g;

// 判斷字串是否為中文字元或英語字母的正規表示式
var reg = /^([\u4e00-\u9fa5]|[A-z]){1,}$/g;
var reg = /^([\u4e00-\u9fa5]|[A-z])+$/g;

// 判斷字串是否為數字
var reg = /^[0-9]{1,}$/g;
var reg = /^[0-9]+/g;

// 匹配所有'is'後面接著 ' all'的子串
var str = "Is this all there is";
var arr = str.match(/is(?= all)/g);

// 匹配所有'is'後面沒有接著 ' all'的子串
var str = "Is this all there is";
var arr = str.match(/is(?! all)/ig);

元字元的使用


/*

任意字元佔位
	. 可以表示任意字元
	
數字字母下劃線佔位
	\w 可以表示數字、字母、下劃線,等價於 [A-z0-9_]
	\W 非數字、字母、下劃線,等價於 [^A-z0-9_]
	
數字佔位
	\d 表示數字,等價於 [0-9]
	\D 非數字,等價於 [^0-9]

空白字元佔位
	\s 表示空白字元
	\S 非空白字元

單詞邊界佔位
	\b 表示單詞邊界
	\B 非單詞邊界

特殊符合佔位
	\n 表示換行符
	\t 表示製表符
	\r 表示回車

注意:這裡的佔位表示在正規表示式中的佔位

*/

// 刪除字串中所有字母
var str = '909abcd397sdad116';
str = str.replace(/[a-z]/gi, '');

// 匹配句子中的 child 單詞
var str = 'children child children child'
var arr = str.match(/\bchild\b/g);

// 去除字串開頭和末尾的空格
var reg = /^\s*|\s*$/g;
var str = '        ab  c         ';
str = str.replace(reg, '');

// 以 換行符、製表符、回車、逗號、空格、減號、/ 、* 、\ 、下劃線 來分割字串
var reg = /[\n\t\r,\s-/\*\\_]+/g;
var str = 'abc,def xyz---omg/bili\\didi/momo*123';
var strArr = str.split(reg);

/*
[
  'abc',     'def',
  'xyz-omg', 'bili',
  'didi',    'momo',
  '123'
]
*/

// 判斷輸入的字串是否是標準的郵箱格式
// 規則:
// 		1. 以長度至少為3的任意字母、數字、下劃線開頭
// 		2. 後面可能緊接著一個 . 然後長度至少為1的任意數字、字母、下劃線
//		3. 接著有一個 @
// 		4. 接著就是長度至少為1的任意數字、字母
//		5. 最後以 . 和 長度為{2,5}的字母結尾
var reg = /^\w{3,}(\.\w+)*@{0-9a-z}+(\.[a-z]{2,5})$/ig;
reg.test('90921399@126.moc'); // true
reg.test('k909392221.momo@qq.com'); // true

小結


  1. 當一個子串匹配完後,該子串相當於刪除,接著往後面匹配
  2. 有量詞的,是從最大量開始匹配
  3. 帶上中括號的表示匹配字元
  4. 中括號結合量詞使用可以匹配任意長度符合規則的子串,且長度是根據指定的最大長度收縮著匹配
  5. 開全域性g則表示匹配所有符合規則的,不開全域性則只匹配第一個
  6. split 就算不開全域性也相當於開了全域性
  7. search 開了全域性也沒用,相當於不開

相關文章