当我发现这个不寻常的问题时,我正在回答以下问题。
模式: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注意:我并不是要求正确的正则表达式。如果您能解决,请在上述帖子中留言。这个问题特定于所提到的正则表达式的差异
让我们首先看看你的正则表达式做了什么:
(?!a)检查下一个字符不是a\d*匹配任意数量的数字(?=c)检查下一个字符是否是c在这个中,(?!a)是毫无意义的,因为下一个字符是数字或c根据模式的其余部分。(例如,它也会拆分b1c为b和c)您可能一直在寻找后向查找(JS 中不支持)(?<=a)来检查前一个字符是否为a。
根据您的评论,您似乎混淆了消极前瞻(?!pattern)和(积极)后瞻(?<=pattern)
第二个正则表达式非常相似,只是您检查通用(小写)字母而不是某些字母。如果这些字母 ( ) 之间没有数字ac,则可以将正则表达式简化为(?![a-z])(?=[a-z])
(?![a-z])检查下一个字符是否不是字母(?=[a-z])检查下一个字符是否是字母这永远不可能是真的。
| 归档时间: |
|
| 查看次数: |
972 次 |
| 最近记录: |