每个使用javascript的人都必须在某一时刻处理字符串。有时,您只需将字符串存储在另一个变量中,然后将其传递。其他时候,您必须检查它并查看它是否包含特定的子字符串。
然而,事情并不总是那么容易。有时您不会寻找特定的子字符串,而是寻找一组遵循特定模式的子字符串。
假设您必须用“apples”替换字符串中所有出现的“Apples”。你可以简单地使用theMainString.replace("Apples", "apples")
. 好,易于。
现在假设您也必须将“appLes”替换为“apples”。同样,“appLES”也应该变成“apples”。基本上,“Apple”的所有大小写变体都需要更改为“apple”。在这种情况下,将简单的字符串作为参数传递将不再实用或有效。
这就是正则表达式的用武之地——您可以简单地使用不区分大小写的标志i
并完成它。有了标志,原始字符串是否包含“Apples”、“APPles”、“ApPlEs”或“Apples”都没有关系。该单词的每个实例都将替换为“apples”。
就像不区分大小写的标志一样,正则表达式提供了许多其他功能,本教程将介绍这些功能。
在 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
在正则表达式中使用时,它将匹配所有非数字字符。
下面的例子应该让事情变得清楚。
"L8".replace(/\d/i, "E"); // LE "L8".replace(/\D/i, "E"); // E8 "LLLLL8".replace(/\D/i, "E"); // ELLLL8
您应该注意,在第三种情况下仅替换第一个匹配的字符。您还可以使用标志来替换所有匹配项。稍后我们将了解这些标志。
就像\d
and一样\D
,还有其他特殊字符序列。
您可以使用
\w
匹配字符串中的任何“单词”字符。这里,单词字符指的是AZ、az、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
同样,您可以使用来匹配非单词边界。例如,您可以使用仅匹配位于另一个单词中的“app”,例如“pineapple”。 \B
\B
匹配模式“n”次
您可以使用^
来告诉 javaScript 仅查看字符串的开头以进行匹配。同样,您可以使用$
仅查看字符串末尾的匹配项。
您可以使用*
0 次或多次匹配前面的表达式。例如,/Ap*/
将匹配A、Ap、App、Appp等。
以类似的方式,您可以使用+
1 次或多次匹配前面的表达式。例如,/Ap+/
将匹配Ap、App、Appp等。这次表达式将不匹配单个A。
有时,您只想匹配给定模式的特定出现次数。在这种情况下,您应该使用{n}
字符序列,其中 n 是一个数字。例如,/Ap{2}/
将匹配App但不匹配Ap。它还将匹配Appp中的前两个“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
使用括号记住匹配项
到目前为止,我们只用常量字符串替换了模式。例如,在上一节中,我们使用的替换始终是“添加”。有时,您必须在给定字符串中查找模式匹配,然后将其替换为模式的一部分。
假设您必须在一个字符串中找到一个包含五个或更多字母的单词,然后在该单词的末尾添加一个“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+)\sand\s(\w+)/, '$2 and $1'); // I am looking for Jason and John
使用带有正则表达式的标志
正如我在介绍中提到的,正则表达式的另一个重要特性是使用特殊标志来修改搜索的执行方式。这些标志是可选的,但您可以使用它们来执行诸如使搜索全局或不区分大小写之类的事情。
这些是更改 JavaScript 搜索或替换字符串方式的四个常用标志。
g
:此标志将执行全局搜索,而不是在第一次匹配后停止。i
:此标志将执行搜索而不检查是否完全匹配。例如,在不区分大小写的搜索中,Apple、aAPPLe 和 aPLE 都被视为相同。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 中的正则表达式及其重要性。我们从基础开始,然后介绍了反斜杠和其他特殊字符。我们还学习了如何检查字符串中的重复模式以及如何记住模式中的部分匹配项以便以后使用它们。