正则表达式中的负向后查找中的范围与字符

Raj*_*esh 2 javascript regex

当我发现这个不寻常的问题时,我正在回答以下问题

模式: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))
Run Code Online (Sandbox Code Playgroud)

在我的第二次尝试中,我尝试使模式更加通用并尝试/(?![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))
Run Code Online (Sandbox Code Playgroud)

根据我的理解,这将检查每个字符的前一个值作为字符,下一个值也作为字符。另外,因为我已经使用了\d*它,所以它应该拆分ac["a", "c"]这在这个正则表达式中没有发生,但在前一个正则表达式中起作用)。

所以我的问题除了字符的选择之外,这些正则表达式有什么区别:

  • /(?!a)\d*(?=c)/g
  • /(?![a-z])\d*(?=[a-z])/g

注意:我并不是要求正确的正则表达式。如果您能解决,请在上述帖子中留言。这个问题特定于所提到的正则表达式的差异

Seb*_*ske 5

让我们首先看看你的正则表达式做了什么:

  • (?!a)检查下一个字符不是a
  • \d*匹配任意数量的数字
  • (?=c)检查下一个字符是否是c

在这个中,(?!a)是毫无意义的,因为下一个字符是数字或c根据模式的其余部分。(例如,它也会拆分b1cbc)您可能一直在寻找后向查找(JS 中不支持)(?<=a)来检查前一个字符是否为a

根据您的评论,您似乎混淆了消极前瞻(?!pattern)和(积极)后瞻(?<=pattern)

第二个正则表达式非常相似,只是您检查通用(小写)字母而不是某些字母。如果这些字母 ( ) 之间没有数字ac,则可以将正则表达式简化为(?![a-z])(?=[a-z])

  • (?![a-z])检查下一个字符是否不是字母
  • (?=[a-z])检查下一个字符是否是字母

这永远不可能是真的。