每個使用 JavaScript 的人都必須在某一時刻處理字符串。有時,您只需將字符串存儲在另一個變量中,然后將其傳遞出去。其他時候,您必須檢查它并查看它是否包含特定的子字符串。
然而,事情并不總是那么容易。有時您不會查找特定的子字符串,而是查找遵循特定模式的一組子字符串。
假設您必須將字符串中所有出現的“Apples”替換為“apples”。您可以簡單地使用 theMainString.replace(“Apples”, “apples”)。好,易于。
立即學習“Java免費學習筆記(深入)”;
現在假設您還必須將“appLes”替換為“apples”。同樣,“appLES”也應該變成“apples”。基本上,“Apple”的所有大小寫變體都需要更改為“apple”。在這種情況下,傳遞簡單字符串作為參數將不再實用或高效。
這就是正則表達式的用武之地 – 您可以簡單地使用不區分大小寫的標志 i 并完成它。使用該標志后,原始字符串是否包含“Apples”、“APPles”、“ApPlEs”或“Apples”并不重要。該單詞的每個實例都將替換為“apples”。
就像不區分大小寫的標志一樣,正則表達式提供了許多其他功能,本教程將介紹這些功能。
立即學習“Java免費學習筆記(深入)”;
在 JavaScript 中使用正則表達式
您必須使用稍微不同的語法來指示不同 String 方法內的正則表達式。與用引號括起來的簡單字符串不同,正則表達式由括在斜杠之間的模式組成。您在正則表達式中使用的任何標志都將附加在第二個斜杠之后。
回到前面的示例,下面是 replace() 方法使用正則表達式和簡單字符串的樣子。
"I ate Apples".replace("Apples", "apples"); // I ate apples "I ate Apples".replace(/Apples/i, "apples"); // I ate apples "I ate aPPles".replace("Apples", "apples"); // I ate aPPles "I ate aPPles".replace(/Apples/i, "apples"); // I ate apples
正如您所看到的,正則表達式在這兩種情況下都有效。我們現在將了解有關構成正則表達式內模式的標志和特殊字符的更多信息。
正則表達式中的反斜杠
您可以通過在普通字符前添加反斜杠將其轉換為特殊字符。同樣,您可以通過在特殊字符前添加反斜杠將其轉換為普通字符。
例如,d 不是特殊字符。然而, d 用于匹配字符串中的數字字符。同樣,D 也不是特殊字符,但 D 用于匹配字符串中的非數字字符。
數字字符包括 0、1、2、3、4、5、6、7、8 和 9。當您在正則表達式中使用 d 時,它將匹配以下任何一個九個字符。當您在正則表達式中使用 D 時,它將匹配所有非數字字符。
下面的例子應該可以讓事情變得清楚。
立即學習“Java免費學習筆記(深入)”;
"L8".replace(/d/i, "E"); // LE "L8".replace(/D/i, "E"); // E8 "LLLLL8".replace(/D/i, "E"); // ELLLL8
您應該注意,在第三種情況下,僅替換第一個匹配的字符。您還可以使用標志來替換所有匹配項。我們稍后將了解此類標志。
立即學習“Java免費學習筆記(深入)”;
就像 d 和 D 一樣,還有其他特殊字符序列。
- 您可以使用 w 來匹配字符串中的任何“word”字符。這里,單詞字符是指A-Z、a-z、0-9和_。因此,基本上,它將匹配所有數字、所有小寫和大寫字母以及下劃線。
- 您可以使用 W 來匹配字符串中的任何非單詞字符。它將匹配 %、$、#、 $ 等字符。
- 您可以使用 s 來匹配單個空白字符,其中包括空格、制表符、換頁符和換行符。同樣,您可以使用 S 來匹配除空格之外的所有其他字符。
- 您還可以使用 f、n、r、t 和 v,分別代表換頁、換行、回車、水平制表符和垂直制表符。
有時,您會遇到需要用替代詞替換某個詞的情況,但前提是它不是 較大詞的一部分。例如,考慮以下句子:
“應用程序上發布了大量菠蘿圖片”。
在本例中,我們希望將“app”一詞替換為“board”。然而,使用簡單的正則表達式模式會將“apple”變成“boardle”,最終的句子將變成:
“應用程序上發布了很多松板圖像”。
在這種情況下,您可以使用另一個特殊字符序列:b。這會檢查單詞邊界。單詞邊界是通過使用任何非單詞字符(如空格、“$”、“%”、“#”等)形成的。不過請注意,它還包括重音字符,如“ü”。
"A lot of pineapple images were posted on the app".replace(/app/, "board"); // A lot of pineboardle images were posted on the app "A lot of pineapple images were posted on the app".replace(/bapp/, "board"); // A lot of pineapple images were posted on the board
同樣,您可以使用 B 來匹配非單詞邊界。例如,您可以使用 B 僅匹配位于另一個單詞(如“pineapple”)內的“app”。
匹配模式“n”次
您可以使用 ^ 告訴 JavaScript 僅查看字符串的開頭以進行匹配。同樣,您可以使用 $ 僅查看字符串末尾的匹配項。
您可以使用 * 來匹配前面的表達式 0 次或多次。例如,/Ap*/ 將匹配 A、Ap、App、Appp強>,等等。
類似地,您可以使用 + 來匹配前面的表達式 1 次或多次。例如,/Ap+/ 將匹配 Ap、App、Appp 等。這次表達式將不會匹配單個 A。
有時,您只想匹配給定模式的特定出現次數。在這種情況下,您應該使用 {n} 字符序列,其中 n 是數字。例如,/Ap{2}/ 將匹配 App,但不匹配 Ap。它還將匹配 Appp 中的前兩個“p”,并保持第三個“p”不變。
您可以使用 {n,} 來匹配給定表達式的至少“n”次出現。這意味著 /Ap{2,}/ 將匹配 App,但不匹配 Ap。它還將匹配 Apppp 中的所有“p”,并將它們替換為您的替換字符串。
您還可以使用 {n,m} 指定最小和最大數量,并限制給定表達式應匹配的次數。例如,/Ap{2,4}/ 將匹配 App、Appp 和 Apppp。它還將匹配 Apppppp 中的前四個“p”,并保持其余部分不變。
"Apppppples".replace(/Ap*/, "App"); // Apples "Ales".replace(/Ap*/, "App"); // Apples "Appppples".replace(/Ap{2}/, "Add"); // Addppples "Appppples".replace(/Ap{2,}/, "Add"); // Addles "Appppples".replace(/Ap{2,4}/, "Add"); // Addples
使用括號來記住匹配
到目前為止,我們只用常量字符串替換了模式。例如,在上一節中,我們使用的替換始終是“Add”。有時,您必須在給定字符串中查找模式匹配,然后將其替換為模式的一部分。
假設您必須在字符串中找到一個包含五個或更多字母的單詞,然后在該單詞的末尾添加一個“s”。在這種情況下,您將無法使用常量字符串值作為替換,因為最終值取決于匹配模式本身。
"I like Apple".replace(/(w{5,})/, '$1s'); // I like Apples "I like Banana".replace(/(w{5,})/, '$1s'); // I like Bananas
這是一個簡單的示例,但您可以使用相同的技術在內存中保留多個匹配模式。完整匹配中的子模式數量將由使用的括號數量決定。
在替換字符串中,第一個子匹配將使用 $1 標識,第二個子匹配將使用 $2 標識,依此類推。這是另一個例子,進一步闡明括號的用法。
"I am looking for John and Jason".replace(/(w+)sands(w+)/, '$2 and $1'); // I am looking for Jason and John
將標志與正則表達式結合使用
正如我在簡介中提到的,正則表達式的一個更重要的功能是使用特殊標志來修改搜索的執行方式。這些標志是可選的,但您可以使用它們來執行諸如全局搜索或不區分大小寫之類的操作。
這些是四個常用的標志,用于更改 JavaScript 搜索或替換字符串的方式。
- g:該標志將執行全局搜索,而不是在第一個匹配后停止。
- i:此標志將執行搜索,而不檢查大小寫是否完全匹配。例如,在不區分大小寫的搜索中,Apple、aPPLe 和 apPLE 的處理方式都是相同的。
- m:該標志將執行多行搜索。
- y:此標志將在 lastIndex 屬性指示的索引中查找匹配項。
以下是與標志一起使用的正則表達式的一些示例:
"I ate apples, you ate apples".replace(/apples/, "mangoes"); // "I ate mangoes, you ate apples" "I ate apples, you ate apples".replace(/apples/g, "mangoes"); // "I ate mangoes, you ate mangoes" "I ate apples, you ate APPLES".replace(/apples/, "mangoes"); // "I ate mangoes, you ate APPLES" "I ate apples, you ate APPLES".replace(/apples/gi, "mangoes"); // "I ate mangoes, you ate mangoes" var stickyRegex = /apples/y; stickyRegex.lastIndex = 3; "I ate apples, you ate apples".replace(stickyRegex, "mangoes"); // "I ate apples, you ate apples" var stickyRegex = /apples/y; stickyRegex.lastIndex = 6; "I ate apples, you ate apples".replace(stickyRegex, "mangoes"); // "I ate mangoes, you ate apples" var stickyRegex = /apples/y; stickyRegex.lastIndex = 8; "I ate apples, you ate apples".replace(stickyRegex, "mangoes"); // "I ate apples, you ate apples"
最終想法
本教程的目的是向您介紹 JavaScript 中的正則表達式及其重要性。我們從基礎知識開始,然后介紹反斜杠和其他特殊字符。我們還學習了如何檢查字符串中的重復模式以及如何記住模式中的部分匹配以便以后使用它們。
最后,我們了解了常用的標志,它們使正則表達式變得更加強大。您可以在 MDN 上的這篇文章中了解有關正則表達式的更多信息。
如果您希望我在本教程中澄清任何內容,請隨時在評論中告訴我。
立即學習“Java免費學習筆記(深入)”;