一、使用(?!)排除某个字符串
//示例代码: let str = "I love coding! But I don't like debugging."; let reg = /coding(?!ing)/g; let result = str.replace(reg, "write"); console.log(result); //输出:"I love write! But I don't like debugging."
正则表达式不包含的最基本用法是使用(?!)语法,在匹配时排除某个字符串。比如,我们想要找到所有“coding”单词,但不包括“coding”后面的“ing”时,可以这样写:coding(?!ing)
。
这里的(?!
是一个非捕获组,表示在coding后面不应该跟着ing。这样我们就可以找到所有“coding”单词,但不包括“coding”后面的“ing”部分。
二、使用(?=)匹配符合条件的单词
//示例代码: let str = "My favorite fruit is apple."; let reg = /\b[a-z]+\b(?= \bapple\b)/g; let result = str.match(reg); console.log(result); //输出:["favorite"]
与使用(?!)正好相反,我们也可以使用(?=)语法来查找符合特定条件的单词,比如在一段文本中找到与单词“apple”组合使用的单词。
在上面的示例中,我们使用正则表达式\b[a-z]+\b(?= \bapple\b)
,其中(?= \bapple\b)
表示匹配包含“apple”的单词且该单词前面的单词是任意大小写字母构成的单词,\b表示单词边界,[a-z]+表示至少一个小写字母组成的单词。
三、使用模式拼接多个正则表达式
//示例代码: let str = "Regex is amazing!
"; let reg1 = /<(\/)?[a-z]*>/g; let reg2 = /[^a-zA-Z]+/g; let result = str.replace(reg1, "").replace(reg2, " "); console.log(result); //输出:"Regex is amazing"
正则表达式不包含还可以用于模式拼接,将多个正则表达式拼接起来实现特定的功能。比如,我们想要将HTML标签和标点符号都删除并只保留单词,可以将多个正则表达式拼接起来使用。
在上面的示例中,我们使用两个正则表达式/<(\/*)?[a-z]*>/g
和/[^a-zA-Z]+/g
,将HTML标签和标点符号删除,并只留下单词部分。
四、使用负向预查匹配
//示例代码: let str1 = "ab1cd2ef3"; let reg1 = /\d+(?=[a-z])/; let result1 = str1.match(reg1); console.log(result1); let str2 = "abcABC123"; let reg2 = /\w+(?!123)/; let result2 = str2.match(reg2); console.log(result2); //输出:["2"] 和 ["abcABC"]
负向预查匹配是指匹配一个字符,除非这个字符的后面紧跟着指定的模式。在正则表达式中使用(?!...)
即可实现负向预查匹配。
在上面的示例中,/\d+(?=[a-z])
可以匹配数字后面跟着字母的部分,如“2e”;/\w+(?!123)/
则可以匹配除了以“123”结尾的单词,如“abcABC”。
五、使用(?<=)匹配以某个字符结尾的单词
//示例代码: let str = "First one, second, third."; let reg = /(?<=, )\b[a-z]+\b/g; let result = str.match(reg); console.log(result); //输出:["second", "third"]
与使用(?!)和(?=)正好相反,我们还可以使用(?<=)语法来查找以某个字符结尾的单词。这里的(?<=...)
表示匹配前面是...的部分,并在这个部分后面匹配符合条件的单词。
在上面的示例中,我们使用正则表达式/(?<=, )\b[a-z]+\b/g
,其中(?<=, )
表示匹配以逗号和空格结尾的单词,\b表示单词边界,[a-z]+表示至少一个小写字母组成的单词。