正则表达式中负面观察的范围与字符

时间:2017-02-22 09:25:20

标签: javascript regex

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

模式:a<n digits>b和正则表达式应捕获<n digits>

在我的第一种方法中,我尝试制作特定于角色的模式并尝试/(?!a)\d*(?=c)/g;

&#13;
&#13;
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;
&#13;
&#13;

在我的第二次尝试中,我尝试使模式更加通用并尝试/(?![a-z])\d*(?=[a-z])/g

&#13;
&#13;
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;
&#13;
&#13;

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

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

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

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

1 个答案:

答案 0 :(得分:3)

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

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

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

根据您的评论,您似乎混淆了负向前瞻(?!pattern)和(正面)后瞻(?<=pattern)

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

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

这永远不会成真。