首頁 > 軟體

正規表示式RegExp語法與用法詳解

2022-10-12 14:01:45

正規表示式的定義和用途

正規表示式用於定義一些字串的規則。計算機可以根據正規表示式,來檢查一個字串是否符合指定的規則,或者將字串中符合規則的內容提取出來。

RegExp的意思是 Regular expression。使用typeof檢查正則物件,會返回object。

建立正規表示式

方式一:使用建構函式建立

使用建構函式建立時,更加靈活,因為引數中還可以傳遞變數。

	var 變數 = new RegExp("正規表示式"); // 注意,引數是字串
	var 變數 = new RegExp("正規表示式", "匹配模式"); // 注意,兩個引數都是字串

匹配模式作為第二個引數。這個引數可以是:

  • i 忽略大小寫。這裡的 i 指的是 ignore。
  • g 全域性匹配模式。這裡的 g 指的是 global。
var reg = new RegExp("a"); // 定義一個正規表示式:檢查一個字串中是否含有 a
 
var reg = new RegExp('A', 'i');
var str = 'qiangu';
 
console.log(reg.test(str)); // 列印結果:true

方式二:使用字面量建立

	var 變數 = /正規表示式/;  // 注意,這個語法裡沒有引號
 
	var 變數 = /正規表示式/匹配模式;  // 注意,這個語法裡沒有引號
	var reg = /A/i; // 定義正規表示式的規則:檢查一個字串中是否含有 a。忽略大小寫。
	var str = "qiangu";
 
	console.log(typeof reg);  // 列印結果:object
	console.log(reg.test(str)); // 列印結果:true

正規表示式的語法

匹配字元

字元描述
.匹配任意單個字元除了換行符
[ ][ ] 內為字元集,匹配 [ ] 內任一字元
[^ ]匹配除了方括號裡的任意字元
*匹配 >= 0 個 * 號前的字元。
+匹配 >= 1 個+號前的字元。
?匹配 0 或 1 個 ?號前的字元。
{n,m}匹配n到m個大括號之前的字元或字元集
(xyz)匹配與 xyz 完全相等的字串
|或運運算元,匹配|符號前或後的字元
s匹配空格
跳脫字元,匹配一些保留的字元 [ ] ( ) { } . * + ? ^ $ |
^從開始行開始匹配
$從末端開始匹配
  • /[ab]/ 等價於 /a|b/:檢查一個字串中是否包含 a或b
  • /[a-z]/:檢查一個字串那種是否包含任意小寫字母
  • /[A-Z]/:任意大寫字母
  • /[A-z]/:任意字母
  • /[0-9]/:任意數位
  • /a[bde]c/:檢查一個字串中是否包含 abc 或 adc 或 aec
  • [Tt]he 匹配 the 和 The
  • [^c]ar 匹配一個後面跟著ar的除了c的任意字元,如匹配par,不匹配car
  • [a-z]* 匹配一個行中所有以小寫字母開頭的字串。
"[a-z]*" => The car parked in the garage

c.+t 匹配以首字母c開頭以t結尾,中間跟著至少一個字元的字串

"c.+t" => The fat cat sat on the mat
  • [T]?he 匹配字串 he 和 The
  • [0-9]{2,3} 匹配最少 2 位最多 3 位 0~9 的數位
  • 可以省略第二個引數。 例如,[0-9]{2,} 匹配至少兩位 0~9 的數位。
  • 逗號也省略掉則表示重複固定的次數。 例如,[0-9]{3} 匹配3位數位
  • (c|g|p)ar 匹配 car 或 gar 或 par
  • "(f|c|m)at.?" => The fat cat sat on the mat.
  • "(T|t)he" => The car is parked in the garage.
  • "^(T|t)he" => The car is parked in the garage.

簡寫

簡寫描述
w匹配所有字母數位,等同於 [a-zA-Z0-9_]
W匹配所有非字母數位,即符號,等同於: [^w]
d匹配數位: [0-9]
D匹配非數位: [^d]
s匹配所有空格字元,等同於: [tnfrp{Z}]
S匹配所有非空格字元: [^s]
f匹配一個換頁符
n匹配一個換行符
r匹配一個回車符
t匹配一個製表符
v匹配一個垂直製表符
p匹配 CR/LF(等同於 rn),用來匹配 DOS 行終止符

模式修正符

標誌描述
i忽略大小寫。
g全域性搜尋。
m多行修飾符:錨點元字元 ^ $ 工作範圍在每行的起始。
  • "/The/gi" => The fat cat sat on the mat.
  • "/.(at)/g" => The fat cat sat on the mat.
  • (^,$) 用於檢查格式是否是在待檢測字串的開頭或結尾。但我們如果想要它在每行的開頭和結尾生效,我們需要用到多行修飾符 m。

貪婪匹配

正規表示式預設採用貪婪匹配模式,在該模式下意味著會匹配儘可能長的子串。

"/(.*at)/" => The fat cat sat on the mat.

惰性匹配

使用 ? 將貪婪匹配模式轉化為惰性匹配模式。

"/(.*?at)/" => The fat cat sat on the mat.

斷言

符號描述
?=正先行斷言-存在
?!負先行斷言-排除
?<=正後發斷言-存在
?<!負後發斷言-排除
  • 定義一個正先行斷言要使用 ()。在括號內部使用一個問號和等號: (?=...)。正先行斷言的內容寫在括號中的等號後面。 例如,表示式 (T|t)he(?=sfat) 匹配 The 和 the,在括號中我們又定義了正先行斷言 (?=sfat) ,即 The 和 the 後面緊跟著 (空格)fat。
"(T|t)he(?=sfat)" => The fat cat sat on the mat.
  • 負先行斷言 ?! 用於篩選出其後不跟隨斷言中定義的格式。表示式 (T|t)he(?!sfat) 匹配 The 和 the,且其後不跟著 (空格)fat。
"(T|t)he(?!sfat)" => The fat cat sat on the mat.
  • 正後發斷言 記作(?<=...) 用於篩選所有匹配結果,篩選條件為 其前跟隨著斷言中定義的格式。 例如,表示式 (?<=(T|t)hes)(fat|mat) 匹配 fat 和 mat,且其前跟著 The 或 the。
"(?<=(T|t)hes)(fat|mat)" => The fat cat sat on the mat.
  • 負後發斷言 記作 (?<!...) 用於篩選所有匹配結果,篩選條件為 其前不跟隨著斷言中定義的格式。 例如,表示式 (?<!(T|t)hes)(cat) 匹配 cat,且其前不跟著 The 或 the。
"(?<!(T|t)hes)(cat)" => The cat sat on cat.

正規表示式的使用

判斷字串是否符合規則 test()

符合則返回true,否則返回false。

  var reg = /[^ab]/; // 規則:字串中,除了a、b之外,還有沒有其他的字元內容?
  var str = "acb";
 
  console.log(reg.test(str)); // 列印結果:true
	var reg = /[^0-9]/;  // 規則:字串中,除了數位之外,還有沒有其他的內容?
	var str1 = "1991";
	var str2 = "199a1";
 
	console.log(reg.test(str1)); // 列印結果:false (如果字串是 純數位,則返回 false)
	console.log(reg.test(str2)); // 列印結果:true

搜尋第一個符合條件的字串 search()

search()【只會查詢第一個】——搜尋字串中是否含有指定內容。如果搜尋到指定內容,則會返回第一次出現的索引;否則返回-1。

	var str = "hello abc hello aec afc";
	// 搜尋字串中是否含有abc 或 aec 或 afc
	result = str.search(/a[bef]c/);
	console.log(result); // 列印結果:6

搜尋所有符合條件的字串 match()

從一個字串中將符合條件的內容提取出來,封裝到一個陣列中返回(即使只查詢到一個結果)。

預設情況下,match()方法只會找到第一個符合要求的內容,設定正規表示式為全域性匹配模式,這樣就會匹配到所有的內容,並以陣列的形式返回。

可以為一個正規表示式設定多個匹配模式,且匹配模式的順序無所謂。

	var str = "1a2a3a4a5e6f7A8B9C";
 
	var result1 = str.match(/[a-z]/);   // 找到符合要求的第一個內容,然後返回
	var result2 = str.match(/[a-z]/g);  // 設定為「全域性匹配」模式,匹配字串中 所有的小寫字母
	var result3 = str.match(/[a-z]/gi); // 設定多個匹配模式,匹配字串中 所有的字母(忽略大小寫)
 
	console.log(result1); // 列印結果:["a"]
	console.log(result2); // 列印結果:["a", "a", "a", "a", "e", "f"]
	console.log(result3); // 列印結果:["a", "a", "a", "a", "e", "f", "A", "B", "C"]

字串拆分成陣列 split()

	var str = "1a2b3c4d5e6f7g";
	var result = str.split(/[A-z]/); // 引數是一個正規表示式:表示所有字母
	console.log(result); //  ["1", "2", "3", "4", "5", "6", "7", ""]

 字串替換 replace()

預設只會替換第一個,如果需要替換全部符合條件的內容,可以設定正規表示式為全域性匹配模式。

let str1 = '2020/5/20'
console.log(str1.replace(///g,"-"));  //得到 2020-5-20
   
var str2 = "Today is fine day,today is fine day !!!"
console.log(str2.replace("today","tomorrow"));  //只能替換第一個today
console.log(str2.replace(/today/gi,"tomorrow")); //這裡用到了正則,且為「全域性匹配」模式,才能替換所有的today

過濾HTML標籤 

str.replace(/<.*?>/g, "") 

去除空格

	str = str.replace(/^s*/, ""); //去除開頭的空格
 
	str = str.replace(/s*$/, ""); //去除結尾的空格

常用正規表示式

常用正規表示式大全

最全的常用正規表示式大全——包括校驗數位、字元、一些特殊的需求等等

非零數位(只能輸入數位,但值不能為0,可以是00,01等)

/^([0]{2}|0[1-9]|[1-9])d*$/

驗證保留兩位小數的正整數或0

/^([1-9]d*|0)(.d{1,2})?$/

驗證手機號碼,如13908653654

/^(1[3|5|7|8][0-9]{9})$/

驗證固定號碼,如010-86551122或01086551122

/^((0d{2,3})[-]?)(d{7,8})([-]?(d{3,}))?$/

 驗證電話號碼—手機號碼或固定號碼,如13908653654或010-86551122或01086551122

/(^(1[3|5|7|8][0-9]{9})$)|(^((0d{2,3})[-]?)(d{7,8})([-]?(d{3,}))?$)/

驗證一代身份證號碼

/^d{8}(0d|10|11|12)([0-2]d|30|31)d{3}$/

驗證二代身份證號碼

/^d{6}(18|19|20)d{2}(0d|10|11|12)([0-2]d|30|31)d{3}[dXx]$/

驗證通用身份證號碼

/(^d{8}(0d|10|11|12)([0-2]d|30|31)d{3}$)|(^d{6}(18|19|20)d{2}(0d|10|11|12)([0-2]d|30|31)d{3}(d|X|x)$)/

總結

到此這篇關於正規表示式RegExp語法與用法的文章就介紹到這了,更多相關正規表示式RegExp詳解內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com