正则表达式进阶--玩转分组、前瞻和后顾( 三 )

var str = 'ooo1212ooo2323ooo3434ooo1234'; var reg = /(d)(d)12/g; var result = str.match(reg); console.log(result); // ['1212', '2323', '3434']在上述示例中 , 所定义的reg是, d匹配数字,1对应的是第一个表达式(d) , 2对应的是第二个表达式(d),g是全局匹配
前瞻前瞻是指在匹配过程中,我们可以在当前位置向前查看,以确定是否满足某种条件 。通过使用前瞻,我们可以对匹配的结果进行更精确的控制,从而实现更复杂的匹配需求 。
在正则表达式中 , 有两种常见的前瞻:正向前瞻和负向前瞻 。正向前瞻使用肯定的条件来匹配 , 即只有当某个模式的后面紧跟着满足指定条件的内容时 , 才认为匹配成功 。而负向前瞻则使用否定的条件来匹配,即只有当某个模式的后面不满足指定条件的内容时,才认为匹配成功 。
通过使用前瞻,我们可以实现一些复杂的匹配需求 。例如,我们可以使用正向前瞻来匹配一个单词后面跟着某个特定字符的情况,或者使用负向前瞻来匹配一个单词后面不跟着某个特定字符的情况 。这样,我们就可以更加灵活地处理匹配的结果 。
接下来我们将通过实际的例子和案例,帮助大家更好地理解和应用前瞻 。同时,我们也将介绍一些常见的前瞻应用场景 , 帮助大家更好地掌握正则表达式中的前瞻功能 , 提升文本处理的效率和准确性 。
1. 正向前瞻正向前瞻的语法是使用括号和问号来表示,即(?=pattern),其中pattern表示要查找的模式 。当正向前瞻被使用时,它会在当前位置向前查找,如果满足指定的条件,则返回匹配成功,否则返回匹配失败 。
示例一:匹配邮箱地址中的用户名const emails = ['john@example.com', 'jane.doe@example.com', 'foo@bar.com'];const usernameRegex = /w+(?=@)/;emails.forEach(email => {const match = email.match(usernameRegex);console.log(match[0]);});运行上述代码,我们可以得到以下输出:
johnjane.doefoo在这个例子中 , 我们使用了正向前瞻(?=@)来匹配@符号之前的内容 。w+表示匹配一个或多个字母、数字或下划线,(?=@)表示要求在当前位置向前查找,必须紧跟着@符号 。
示例二:匹配包含特定单词的句子假设我们有一段文本,我们想要匹配其中包含特定单词的句子 。
const text = 'I love JavaScript. JavaScript is amazing. Python/ target=_blank class=infotextkey>Python is also great.';const word = 'JavaScript';const sentenceRegex = /[^.?!]*(?=bJavaScriptb)[^.?!]*[.?!]/g;const matches = text.match(sentenceRegex);console.log(matches);运行上述代码 , 我们可以得到以下输出:
[ 'I love JavaScript.', ' JavaScript is amazing.' ]在这个例子中,我们使用了正向前瞻(?=bJavaScriptb)来匹配包含特定单词JavaScript的句子 。[^.?!]*表示匹配任意数量的非句子结束符(句号、问号、感叹号)的字符,bJavaScriptb表示匹配单词JavaScript[^.?!]*[.?!]表示匹配任意数量的非句子结束符后跟一个句子结束符的字符 。
示例三:匹配密码强度假设我们要验证用户输入的密码强度,要求密码必须包含至少一个大写字母、一个小写字母和一个数字 。
const passwords = ['password123', 'Pass123', 'passWORD', '123456'];const passwordRegex = /^(?=.*[a-z])(?=.*[A-Z])(?=.*d).{8,}$/;passwords.forEach(password => {const isValid = passwordRegex.test(password);console.log(`${password}: ${isValid}`);});运行上述代码 , 我们可以得到以下输出:
password123: falsePass123: falsepassWORD: false123456: false在这个例子中,我们使用了正向前瞻(?=.*[a-z])(?=.*[A-Z])(?=.*d)来分别匹配至少一个小写字母、一个大写字母和一个数字 。.{8,}表示匹配至少8个字符 。^$分别表示匹配字符串的开头和结尾,确保整个字符串都满足要求 。
2. 负向前瞻负向前瞻的语法结构是 (?!pattern),它表示在当前位置向前查找 , 确保接下来的文本不匹配 pattern 。如果匹配成功,则当前位置不会被视为匹配项,继续向后匹配 。
示例一:匹配不以 "abc" 开头的字符串const regex = /^(?!abc).*/;console.log(regex.test("def")); // trueconsole.log(regex.test("abcxyz")); // false


推荐阅读