持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情
RegExp
RegExp有两种方法可以创建一个RegExp对象:一种是字面量,另一种是构造函数。
let reg1 = /ab+c/i // 字面量形式
let reg2 = new RegExp('ab+c', 'i');
let reg3 = new RegExp(/ab+c/, 'i');
RegExp实例方法
- exec()方法在一个指定字符串中执行一个搜索匹配。返回一个结果数组或 null。
let reg = /ab*/g
let str = 'abcabcd'
let res = reg.exec(str) // res = [0: "ab",index: 0,input: "abcabcd"]
res中0:匹配的全部字符串,index:匹配的的字符串位于原字符串的索引值,input:原字符串。reg:lastIndex:下一次匹配开始的位置,ignoreCase:是否使用了 "i" 标记使正则匹配忽略大小写,global:是否使用了 "g" 标记来进行全局的匹配,source:正则匹配的字符串。
当正则表达式使用 "g" 标志时,可以多次执行 exec 方法来查找同一个字符串中的成功匹配。
let re = /ab*/g
let str = 'abcabcd'
let myArray
while ((myArray = re.exec(str)) !== null) {
console.log(myArray[0],re.lastIndex);
}
- test()
表达式:regexObj.test(str),如果正则表达式与指定的字符串匹配 ,返回
true;否则false。
let str = 'hello world!';
let result = /^hello/.test(str);
console.log(result); // true
如果正则表达式设置了全局标志,test() 的执行会改变正则表达式lastIndex属性。连续的执行test()方法,后续的执行将会从 lastIndex 处开始匹配字符串。具体可以参考上面的exec()方法。
var regex = /foo/g;
regex.test('foo'); // true
regex.test('foo'); // false
正则表达式中的特殊字符
这里简单列一些常用的:
- ^ 符号,匹配输入的开始,如果多行标志被设置为 true,那么也匹配换行符后紧跟的位置。
let re = /^A/
let res = re.test('AneG') // res = true
let res1 = re.test('abcd) // res1 = false
- $ 符号,匹配输入的结束。如果多行标志被设置为 true,那么也匹配换行符前的位置。
let re = /E$/
let res = re.test('abcE') // res = true
-
- 符号,匹配前一个表达式 0 次或多次。等价于
{0,}。
- 符号,匹配前一个表达式 0 次或多次。等价于
let re = /ab*/
let res = re.test('abbE') // res = true,它所匹配的出来的字符串是 abb
-
- 符号,匹配前一个表达式 1 次或多次。等价于
{1,}。
- 符号,匹配前一个表达式 1 次或多次。等价于
-
? 符号,匹配前面一个表达式 0 次或者 1 次。等价于
{0,1}。例如/e?le?/匹配 "angel" 中的 'el'、"angle" 中的 'le' 以及 "oslo' 中的 'l'。 -
. 符号,(小数点)默认匹配除换行符之外的任何单个字符。
-
x|y, 匹配‘x’或者‘y’。例如,/green|red/匹配“green apple”中的‘green’和“red apple”中的‘red’
-
{n},n 是一个正整数,匹配了前面一个字符刚好出现了 n 次。\比如, /a{2}/ 不会匹配“candy”中的'a',但是会匹配“caandy”中所有的 a.
-
{n,}, 匹配了前面一个字符至少出现了 n 次。
-
{n,m}, 匹配了前面一个字符至少出现了 n 次,最多出现m次。
-
[xyz],匹配一个字符集合。匹配方括号中的任意字符,包括转义序列。你可以使用破折号(-)来指定一个字符范围。例如,[abcd] 和 [a-d] 是一样的。他们都匹配"brisket"中的‘b’,也都匹配“city”中的‘c’。
-
[^xyz], 一个反向字符集。也就是说, 它匹配任何没有包含在方括号中的字符。你可以使用破折号(-)来指定一个字符范围。
-
\b, 匹配一个词的边界。一个词的边界就是一个词不被另外一个“字”字符跟随的位置或者前面跟其他“字”字符的位置,例如: /oo\b/并不匹配"moon"中的'oo',因为'oo'被一个“字”字符'n'紧跟着。/oon\b/匹配"moon"中的'oon',因为'oon'是这个字符串的结束部分。这样他没有被一个“字”字符紧跟着。
-
\d, 匹配一个数字。等价于 [0-9]。
-
\D, 匹配一个非数字字符。等价于 [^0-9]。
-
\w, 匹配一个单字字符(字母、数字或者下划线)。等价于
[A-Za-z0-9_]。 -
\W, 匹配一个非单字字符。等价于
[^A-Za-z0-9_]。
正则表达式标志
- g:全局搜索。
- i:不区分大小写搜索。
- m:多行搜索。
- s:允许
.匹配换行符。 - u:使用 unicode 码的模式进行匹配。
- y:执行“粘性 (
sticky)”搜索,匹配从目标字符串的当前位置开始。