📅  最后修改于: 2023-12-03 15:26:52.001000             🧑  作者: Mango
在编写正则表达式时,有时候会需要忽略掉某些部分,只匹配其他部分。本文将介绍如何使用正则表达式匹配但忽略部分。
在正则表达式中,(?:)表示非捕获分组。它和普通的分组一样,可以将一个或多个子模式组合起来,用于匹配。但是,(?:)不会保存匹配的结果,也就是说,匹配结果不会被存储到匹配结果数组中。这样就避免了在匹配结果中出现忽略掉的部分。
例如,下面的正则表达式可以匹配一个URL地址,但是忽略掉协议部分(http://或https://)。
const urlPattern = /(?:http[s]?:\/\/)(?:\w+\.)?[a-zA-Z\d]+\.[a-zA-Z]+/;
const url = 'http://www.example.com';
console.log(url.match(urlPattern)[0]); // 'www.example.com'
在上面的正则表达式中,(?:http[s]?://)匹配协议部分,但是使用了非捕获分组,不会将匹配结果存储到数组中。而(?:\w+.)?表示匹配可能出现的二级域名,也使用了非捕获分组。最后的[a-zA-Z\d]+.[a-zA-Z]+匹配主域名和后缀,这部分会被存储到数组中。
在正则表达式中,(?<=)表示正向肯定预测先行断言,(?=)表示正向零宽断言。
先行断言和零宽断言都属于正则表达式的高级特性,简单来说,它们可以匹配但不捕获某些内容。这些内容通常不参与后续匹配,并且不会被保存到匹配结果中。
例如,下面的正则表达式可以匹配一个包含某个关键字的句子,忽略掉关键字前面的部分。
const sentencePattern = /(?<=\W|^)(?:JavaScript|ECMAScript)(?=\W|$)/;
const sentence = 'I love JavaScript.';
console.log(sentence.match(sentencePattern)[0]); // 'JavaScript'
在上面的正则表达式中,(?<=\W|^)表示匹配关键字前面的部分,也就是非单词字符或字符串开头。但是使用了正向肯定预测先行断言,不会将匹配结果存储到数组中。而(?=\W|$)表示匹配关键字后面的部分,使用了正向零宽断言。最后的(?:JavaScript|ECMAScript)匹配关键字本身,保存到匹配结果中。
在正则表达式中,\K表示重置匹配的起点,也就是说,匹配结果的开始位置从\K的位置开始,之前的所有匹配结果将被忽略掉。
例如,下面的正则表达式可以匹配一个包含某个关键字的句子,忽略掉关键字前面的部分。
const sentencePattern = /\W*\K(?:JavaScript|ECMAScript)\b/;
const sentence = 'I love JavaScript.';
console.log(sentence.match(sentencePattern)[0]); // 'JavaScript'
在上面的正则表达式中,\W*表示匹配关键字前面的部分,也就是零个或多个非单词字符。而\K表示重置匹配的起点,忽略掉之前的匹配结果。最后的(?:JavaScript|ECMAScript)\b匹配关键字本身,也就是单词边界后面的内容。