为何正则表达式/\w+(?=\w*a)(?=\w*i)\w+/gi无法匹配含a、i的affix单词?
问题分析与解决
你的正则匹配不到affix,跟单词开头的字母没关系,是正则本身的逻辑有问题。
原正则/\w+(?=\w*a)(?=\w*i)\w+/gi的结构是:先匹配至少一个单词字符,然后要求当前位置之后的字符里同时包含a和i,再匹配剩下的单词字符。但affix里的a在单词最开头,当前面的\w+吃掉这个a后,后面的字符里就没有a了,导致正向预查(?=\w*a)无法满足,自然匹配失败。
而像gain(g-a-i-n)这类单词,a和i都在中间位置,前面的\w+匹配g后,后面的ain里同时有a和i,预查通过,所以能匹配成功。
修正后的正则
要匹配同时包含a和i的完整单词,应该把两个正向预查放在整个单词的开头,确保整个单词范围内存在这两个字母,再匹配整个单词:
/^(?=.*a)(?=.*i)\w+$/gi
这个正则会先检查整个单词里是否有a和i,只要满足就匹配完整单词,这样affix就能被成功匹配,同时也能匹配gain、rabid、claim、again这些单词。
内容的提问来源于stack exchange,提问作者Charles May
相关产品推荐
相关产品推荐

