JavaScript 正則表達式與 RegExp 物件
您好,有志者!今天,我們將踏上一段令人振奮的旅程,探索 JavaScript 中的正則表達式(RegEx)世界。如果你之前從未聽說過 RegEx,也不用擔心——我們會從最基本的知識開始,逐步學習。在這個教學結束時,你將能夠像專業人士一樣運用 RegEx 的力量!
正則表達式是什麼?
正則表達式,通常縮寫為 RegEx,是強大的工具,用於模式匹配和字符串操作。把它們看作是一種用來描述文本中模式的特殊語言。它們就像瑞士軍刀一樣,在處理字符串時是多功能的且非常有用!
我們從一個簡單的例子開始:
let pattern = /hello/;
let text = "Hello, world!";
console.log(pattern.test(text)); // 輸出:false
在這個例子中,/hello/
是我們的 RegEx 模式,我們正在檢查它是否與文本 "Hello, world!" 匹配。結果是 false
,因為 RegEx 默認是區分大小寫的。
RegExp 物件
在 JavaScript 中,我們可以使用 RegExp 物件來創建 RegEx 模式。這樣做:
let pattern1 = new RegExp("hello");
let pattern2 = /hello/;
console.log(pattern1.test("hello world")); // 輸出:true
console.log(pattern2.test("hello world")); // 輸出:true
這兩種創建 RegExp 物件的方式是等價的。字面量表示法(/pattern/
)由於其簡潔性而被更常見使用。
修飾符
修飾符允許我們改變 RegEx 模式的行為。我們來看看一些常見的修飾符:
修飾符 | 描述 |
---|---|
i | 不區分大小寫的匹配 |
g | 全局匹配(找到所有匹配,而不仅仅是第一個) |
m | 多行匹配 |
以下是一個使用 'i' 修飾符的例子:
let pattern = /hello/i;
let text = "Hello, World!";
console.log(pattern.test(text)); // 輸出:true
現在,我們的模式無論大小寫都能匹配 "Hello"!
括號
在 RegEx 中,括號用於定義要匹配的字符集或範圍:
括號 | 描述 |
---|---|
[abc] | 匹配括號中的任何字符 |
[^abc] | 匹配不在括號中的任何字符 |
[0-9] | 匹配從 0 到 9 的任何數字 |
[a-z] | 匹配任何小寫字母 |
我們來看一個例子:
let pattern = /[aeiou]/;
console.log(pattern.test("hello")); // 輸出:true
console.log(pattern.test("why")); // 輸出:false
這個模式匹配任何元音字母。它在 "hello" 中找到了匹配,但在 "why" 中沒有找到。
量詞
量詞指定為了找到匹配,字符、組或字符類必須出現多少次。
量詞 | 描述 |
---|---|
* | 0 或多個出現次數 |
+ | 1 或多個出現次數 |
? | 0 或 1 個出現次數 |
{n} | 正好 n 個出現次數 |
{n,} | n 或多個出現次數 |
{n,m} | 在 n 和 m 之間的出現次數 |
這裡有一個有趣的例子:
let pattern = /ba+/;
console.log(pattern.test("b")); // 輸出:false
console.log(pattern.test("ba")); // 輸出:true
console.log(pattern.test("baaaa")); // 輸出:true
這個模式匹配 "ba" 後面跟隨著任意數量的 "a"。就像羊的咩叫:"baaaa"!
字面字符
在 RegEx 中,字面字符就是它們自己——它們匹配自身。例如,/hello/
匹配確切的字符序列 "hello"。
let pattern = /hello world/;
console.log(pattern.test("hello world")); // 輸出:true
console.log(pattern.test("hello earth")); // 輸出:false
元字符
元字符在 RegEx 中有特殊含義:
元字符 | 描述 |
---|---|
. | 匹配任何單個字符 |
\d | 匹配任何數字 |
\D | 匹配任何非數字字符 |
\w | 匹配任何單詞字符 |
\W | 匹配任何非單詞字符 |
\s | 匹配任何空白字符 |
\S | 匹配任何非空白字符 |
我們來使用一些元字符:
let pattern = /\d{3}-\d{3}-\d{4}/;
console.log(pattern.test("123-456-7890")); // 輸出:true
console.log(pattern.test("abc-def-ghij")); // 輸出:false
這個模式匹配典型的美國電話號碼格式。
RegExp 屬性
RegExp 物件有幾個有用的屬性:
屬性 | 描述 |
---|---|
global | 是否設置了 "g" 旗標 |
ignoreCase | 是否設置了 "i" 旗標 |
multiline | 是否設置了 "m" 旗標 |
source | 模式的文本 |
lastIndex | 下一次匹配的起始索引 |
以下是如何使用這些屬性的例子:
let pattern = /hello/gi;
console.log(pattern.global); // 輸出:true
console.log(pattern.ignoreCase); // 輸出:true
console.log(pattern.source); // 輸出:"hello"
RegExp 方法
最後,我們來看看一些可以與 RegExp 物件一起使用的方法:
方法 | 描述 |
---|---|
exec() | 在字符串中執行搜索以找到匹配 |
test() | 在字符串中測試是否有匹配 |
toString() | 返回正則表達式的字符串表示形式 |
以下是一個使用 exec()
的例子:
let pattern = /\d+/g;
let text = "我擁有 2 個蘋果和 3 個橙子。";
let match;
while ((match = pattern.exec(text)) !== null) {
console.log(`找到 ${match[0]} 在索引 ${match.index}`);
}
// 輸出:
// 找到 2 在索引 7
// 找到 3 在索引 23
這段代碼找到文本中的所有數字並報告它們的位置。
以上就是 JavaScript 中正則表達式的基本知識。記住,熟能生巧。嘗試創建自己的模式並測試它們。在你還未意識到的時候,你將能夠輕鬆使用 RegEx 來解決各種字符串操作問題!
快樂編程,願你的正則表達式總能找到匹配!
Credits: Image by storyset