正则表达式是表示搜索模式的特殊字符串。也被称为“regex”或“regexp”,它们可以帮助程序员匹配、搜索和替换文本。
简单使用
//测试myString 中是否含有Hello
let myString = "Hello, World!";
let myRegex = /Hello/; //测试规则
// 使用.test方法
let result = myRegex.test(myString); //result为true
注意,/Hello/不会匹配HELLO、hello、HeLLo
多种模式匹配文字字符串
使用“|”操作符分隔条件,eg:匹配"dog"
、"cat"
、"bird"
或者"fish"
。
let petString = "James has a pet cat.";
let petRegex = /dog|cat|bird|fish/;
let result = petRegex.test(petString);//true
匹配时忽略大小写(i)
let myString = "Hello, World!";
let myRegex = /Hello/i;
// 使用.test方法
let result = myRegex.test(myString); //result为true
.match方法提取匹配项(注意使用方式)
"Hello, World!".match(/Hello/);
// Returns ["Hello"]
let extractStr = "Extract the word 'coding' from this string.";
let codingRegex = /coding/;
let result = extractStr.match(codingRegex);
全局匹配(匹配多次)
let twinkleStar = "Twinkle, twinkle, little star";
let starRegex = /Twinkle/gi;
let result = twinkleStar.match(starRegex); // ["Twinkle", "twinkle"]
注意:在正则表达式上可以有多个标志,比如/search/gi(匹配多次包含大小写)
使用通配符" . "
let unRegex = /.un/;//unRegex以匹配字符串"run"、"sun"、"fun"、"pun"、"nun"和"bun"
将单个字符与多种可能性匹配[ ]
//匹配a、e、i、o、u
let quoteSample = "Beware of bugs in the above code; I have only proved it correct, not tried it.";
let vowelRegex = /[aeiou]/gi;
let result = quoteSample.match(vowelRegex);
连字符
(-
)来定义要匹配的字符范围
let alphabetRegex = /[a-z]/gi;
匹配单个未指定的字符(^)
使用字符集中的插入符号(^
)来创建一个否定字符集
//匹配所有非数字或元音字符的正则表达式
let quoteSample = "3 blind mice.";
let myRegex = /[^aeiou0-9]/gi;
let result = quoteSample.match(myRegex);
在字符集之外,插入符号用于字符串的开头搜寻匹配模式。
//匹配以"Cal"开头出现的字符
let calRegex = /^Cal/;
匹配字符串的末尾($)
let lastRegex = /caboose$/;
匹配出现一次或连续多次的字符(+)
//匹配到出现一次或多次的字母s
let myRegex = /s+/g;
匹配出现零次或多次的字符(*)
//匹配"A"及其之后出现的零个或多个"a"
let chewieRegex = /Aa*/;
贪婪匹配和惰性匹配
正则表达式默认为贪婪匹配,它会匹配到适合该匹配模式的最大子字符串。
eg:使用正则表达式/t[a-z]*i/
应用于字符串"titanic",贪婪匹配结果为["titani"],你可以使用?字符来将其变成懒惰匹配。调整后的正则表达式/t[a-z]*?i/
匹配字符串"titanic"
返回["ti"]
。
匹配所有的字母和数字(\w)
这个缩写等同于[A-Za-z0-9_]
。它不仅可以匹配大小写字母和数字,注意,它还会匹配下划线字符(_
)。
//使用\w来计算所有引号中字母和数字字符的数量
let quoteSample = "The five boxing wizards jump quickly.";
let alphabetRegexV2 = /\w/g;
let result = quoteSample.match(alphabetRegexV2).length;//31
匹配非字母数字字符(\W)与\w相反
匹配所有数字(\d)等同于匹配[0-9],匹配不是数字的单个字符(\D)等同于[^0-9]
匹配空白字符(\s),匹配非空白字符(\S)
指定匹配的上限和下限({})
let timRegex = /ah{3,6}/;//匹配出现3次到6次的h
let timRegex = /ah{3,}/;//匹配出现3次及以上的h
let timRegex = /ah{3}/;//匹配仅出现3次的h
检查全部或无(?)
使用问号?指定可能存在的元素,这将检查前面的零个或一个元素。你可以将此符号视为前面的元素是可选的。
let american = "color";
let british = "colour";
let rainbowRegex= /colou?r/;
rainbowRegex.test(american); // Returns true
rainbowRegex.test(british); // Returns true
正向先行断言和负向先行断言
正向先行断言会查看并确保搜索匹配模式中的元素存在,但实际上并不匹配。正向先行断言的用法是(?=...)
,其中...
就是需要存在但不会被匹配的部分。
负向先行断言会查看并确保搜索匹配模式中的元素不存在。负向先行断言的用法是(?!...)
,其中...
是你希望不存在的匹配模式。如果负向先行断言部分不存在,将返回匹配模式的其余部分。
let quit = "qu";
let noquit = "qt";
let quRegex= /q(?=u)/;
let qRegex = /q(?!u)/;
quit.match(quRegex); // Returns ["q"]
noquit.match(qRegex); // Returns ["q"]
先行断言的更实际用途是检查一个字符串中的两个或更多匹配模式。这里有一个简单的密码检查器,密码规则是 3 到 6 个字符且至少包含一个数字:
let password = "abc123";
let checkPass = /(?=\w{3,6})(?=\D*\d)/;
checkPass.test(password); // Returns true
使用捕获组重用模式
括号(和)可以用来匹配重复的子字符串。你只需要把重复匹配模式的正则表达式放在括号中即可。
使用捕获组,以匹配在字符串中仅重复三次的数字,每一个都由空格分隔。
let repeatNum = "42 42 42";
let reRegex = /^(\d+)\s\1\s\1$/;
let result = reRegex.test(repeatNum);
使用捕获组搜索和替换(.replace)
let huhText = "This sandwich is good.";
let fixRegex = /good/;
let replaceText = "okey-dokey";
let result = huhText.replace(fixRegex, replaceText);
删除开头和结尾的空白
let hello = " Hello, World! ";
let wsRegex = /^\s+|\s+$/g;
let result = hello.replace(wsRegex,'');