正則表達式是一種用于匹配文本模式的工具,它能夠幫助我們在處理文本時更加高效地進行搜索、替換和驗證操作。在本篇文章中,我將通過通俗易懂的語言讓正則表達式不再苦澀難懂。
基本規則
在正則表達式中,除了基本的字符匹配規則、字符類和量詞外,還有一些特殊的符號和元字符,它們在正則表達式中具有特殊的含義和作用。以下是一些常見的正則表達式符號和元字符的說明:
- /:正則表達式的開始和結束符號。
- ^:表示匹配文本的開頭。例如,/^abc/ 表示匹配以 "abc" 開頭的文本。
- $:表示匹配文本的結尾。例如,/abc$/ 表示匹配以 "abc" 結尾的文本。
- .:匹配任意單個字符,不包括換行符。例如,/a.c/ 表示匹配以 "a" 開頭,"c" 結尾,中間有任意一個字符的文本。
- |:表示或,可以用于匹配多個表達式中的任意一個。例如,/abc|def/ 表示匹配 "abc" 或 "def"。
- []:表示字符集,用于匹配一組字符中的任意一個。例如,/[abc]/ 表示匹配字母 "a"、"b" 或 "c" 中的任意一個。
- ():表示分組,可以將一部分正則表達式放在括號中,并對它們進行分組匹配。例如,/(ab)+/ 表示匹配一或多個 "ab"。
- ?:表示可選,用于匹配前面的字符或表達式出現零次或一次。例如,/a?b/ 表示匹配零個或一個 "a",后面緊跟一個 "b"。
- *:表示零個或多個,用于匹配前面的字符或表達式出現零次或多次。例如,/ab*c/ 表示匹配一個 "a",后面跟著零個或多個 "b",最后緊跟一個 "c"。
- +:表示一或多個,用于匹配前面的字符或表達式出現一次或多次。例如,/ab+c/ 表示匹配一個 "a",后面跟著一個或多個 "b",最后緊跟一個 "c"。
- {}:表示重復次數,用于指定前面的字符或表達式重復出現的次數范圍。例如,/ab{2,4}c/ 表示匹配一個 "a",后面跟著兩到四個 "b",最后緊跟一個 "c"。
- :表示轉義字符,用于將特殊字符轉義為普通字符。例如,/a./ 表示匹配一個 "a",后面跟著一個 "."。
以上是一些常見的正則表達式符號和元字符的說明,還有一些比較重要的符號和元字符:
- [] 中的 ^:表示不在字符集中,用于匹配不屬于指定字符集中的任意字符。例如,/[^abc]/ 表示匹配除了 "a"、"b"、"c" 之外的任意字符。
- [] 中的 -:表示字符范圍,用于匹配指定范圍內的任意字符。例如,/[a-z]/ 表示匹配任意小寫字母。
- () 中的 |:表示分組中的或,可以用于匹配分組中的任意一個表達式。例如,/(ab|cd)/ 表示匹配 "ab" 或 "cd"。
API
在JAVAScript中,可以使用RegExp對象來創建正則表達式。以下是RegExp對象的一些常用方法:
- test()
用于測試一個字符串是否匹配正則表達式。該方法返回一個布爾值,表示是否匹配成功。
var regex = /^[a-z]+$/; // 匹配小寫字母
var str1 = "hello";
var str2 = "Hello";
console.log(regex.test(str1)); // true
console.log(regex.test(str2)); // fals
- exec()
exec() 方法用于在一個字符串中查找匹配的文本,并返回第一個匹配的結果。如果沒有找到匹配的文本,則返回 null。
該方法返回一個數組,數組的第一個元素是匹配的文本,后面的元素是捕獲分組的匹配結果。如果沒有捕獲分組,則數組的長度為 1。
var regex = /(d{4})-(d{2})-(d{2})/; // 匹配日期格式(yyyy-mm-dd)
var str = "Today is 2023-02-19";
var result = regex.exec(str);
console.log(result); // ["2023-02-19", "2023", "02", "19"]
- match()
match() 方法用于在一個字符串中查找匹配的文本,并返回所有匹配的結果。該方法返回一個數組,數組中的每個元素都是匹配的文本,數組的長度就是匹配次數。
如果正則表達式中有捕獲分組,則返回的數組中每個元素也會包括捕獲分組的匹配結果。
var regex = /cat/g; // 匹配所有的 "cat"
var str = "The cat in the hat sat on the mat.";
var result = str.match(regex);
console.log(result); // ["cat", "cat", "cat"]
- replace()
用于在一個字符串中替換匹配的文本。該方法接受兩個參數,第一個參數是要替換的文本或正則表達式,第二個參數是用于替換的新文本或函數。
如果第一個參數是正則表達式,則可以在替換文本中使用 $1、$2 等語法來引用捕獲分組的匹配結果。
var regex = /world/g;
var str = "hello world";
var newStr = str.replace(regex, "JavaScript");
console.log(newStr); // "hello JavaScript"
var regex2 = /(d{4})-(d{2})-(d{2})/;
var str2 = "Today is 2023-02-19";
var newStr2 = str2.replace(regex2, "$2/$3/$1");
console.log(newStr2); // "Today is 02/19/2023"
練習題
// 匹配以 "a" 開頭,"b" 結尾的字符串
var regex1 = /^a.*b$/;
// 匹配以 "abc" 或 "def" 開頭的字符串
var regex2 = /^(abc|def).*/;
// 匹配以 "a" 開頭,后面跟著一個或多個 "b",最后緊跟一個 "c" 的字符串
var regex3 = /^ab+c$/;
// 匹配任意一個小寫字母或數字的字符串
var regex4 = /^[a-z0-9]+$/;
// 匹配以 "http://" 或 "https://" 開頭的 URL
var regex5 = /^(http|https)://.*/;
// 匹配日期格式(yyyy-mm-dd)
var regex6 = /^d{4}-d{2}-d{2}$/;
// 匹配電話號碼(格式為:xxx-xxxxxxx 或 xxxxxxxxxxx)
var regex7 = /^d{3}-?d{7}$|^d{10}$/;
// 匹配郵箱地址
var regex8 = /^w+([-+.]w+)@w+([-.]w+).w+([-.]w+)*$/;
// 使用正則表達式進行字符串替換
var str = "hello world";
var newStr = str.replace(/world/, "JavaScript");
console.log(newStr); // "hello JavaScript"