当我发现这个不寻常的问题时,我正在回答question。
模式:a<n digits>b
和正则表达式应捕获<n digits>
在我的第一种方法中,我尝试制作特定于角色的模式并尝试/(?!a)\d*(?=c)/g;
var str = "a1c a12c a23c ac 1234 abc";
var str2 = "b1c a12c a23c ac 1234 ab1c"
var re = /(?!a)\d*(?=c)/g;
console.log(str.split(re))
&#13;
在我的第二次尝试中,我尝试使模式更加通用并尝试/(?![a-z])\d*(?=[a-z])/g
var str = "a1c a12c a23c ac 1234 abc";
var str2 = "b1c a12c a23c ac 1234 ab1c"
var re = /(?![a-z])\d*(?=[a-z])/g;
console.log(str.split(re))
&#13;
根据我的理解,这将检查每个字符的前一个值作为字符,下一个值也作为字符。此外,由于我使用了\d*
,因此应将ac
拆分为["a", "c"]
(,这在此正则表达式中没有发生,但在前一个中工作)。
所以我的问题是除了字符的选择,这些正则表达式的区别是什么:
/(?!a)\d*(?=c)/g
/(?![a-z])\d*(?=[a-z])/g
注意:我没有要求正确的正则表达式。如果您能解决,请在上述帖子中发帖。这个问题特定于所提到的正则表达式的差异
答案 0 :(得分:3)
让我们先来看看你的正则表达式做什么:
(?!a)
检查下一个字符是否不是a
\d*
匹配任意数量的数字(?=c)
检查下一个字符是c
在这一个中,(?!a)
毫无意义,因为根据模式的其余部分,下一个字符是数字或c
。 (例如它也会将b1c
拆分为b
和c
)您可能一直在寻找一个lookbehind(JS不支持)(?<=a)
来检查前一个字符是a
。
根据您的评论,您似乎混淆了负向前瞻(?!pattern)
和(正面)后瞻(?<=pattern)
第二个正则表达式非常相似,除了您检查通用(小写)字母而不是某些字母。如果这些字母(ac
)之间没有数字,则可以将正则表达式简化为(?![a-z])(?=[a-z])
(?![a-z])
检查下一个字符是否为字母(?=[a-z])
检查下一个字符是否为字母这永远不会成真。