gpt4 book ai didi

javascript - 为什么第二个反向引用不起作用?

转载 作者:行者123 更新时间:2023-11-29 18:41:46 27 4
gpt4 key购买 nike

我想尽可能地利用反向引用,避免许多模式组合的重复。

其他要求:在不构造new RegExp的情况下少用字面量同时保持通用性。

Original title: Why is this negative lookahead with capturing group not working?

例如一个字符串:

1.'2.2'.33.'4.4'.5.(…etc)

——我要匹配句号分隔的字符,引号不分段,引号被 chop 。即匹配:

1 , 2.2 , 33 , 4.4 , 5 , (…etc) .

一个有效的正则表达式是:

(?<=(["'])(?!\.)).*?(?=\1)|((?!["']|\.).)+

console.log(
"1.'2.2'.33.'4.4'.5.(…etc)".match(
/(?<=(["'])(?!\.)).*?(?=\1)|((?!["']|\.).)+/g
)
)

一个不工作的是:

(?<=(["'])(?!\.)).*?(?=\1)|((?!<b>\1</b>|\.).)+
^^

console.log(
"1.'2.2'.33.'4.4'.5.(…etc)".match(
/(?<=(["'])(?!\.)).*?(?=\1)|((?!\1|\.).)+/g
)
)

——它不匹配 1 , 33 , 5 , (…etc) .

为什么它 ( \1 ^^ ) 不起作用以及如何纠正它?谢谢!

最佳答案

主要的混淆点似乎是反向引用不像“正则表达式子程序”;他们不允许您在别处重复使用部分模式。他们所做的是让您再次匹配之前匹配过的确切字符串。

例如:

console.log(/(\w)\1/.test('AB'));
console.log(/(\w)\1/.test('AA'));
console.log(/(\w)\1/.test('BB'));

(\w)\1 不匹配 AB,但它匹配 AABB\1 部分仅匹配之前 (\w) 组匹配的确切字符串。

在你的情况下,

(?<=(["'])(?!\.)).*?(?=\1)
|
((?!\1|\.).)+

有两个分支被|分隔。第二个分支包含对第一个分支 ((["'])) 中捕获组的反向引用 (\1)。

这永远无法匹配,因为只有在第一个分支无法匹配任何内容时才会尝试第二个分支,但在那种情况下,第一个捕获组也无法匹配任何内容,那么什么字符串会 \1引用?

如果反向引用引用的捕获组从未匹配任何内容,浏览器的行为就好像它是空字符串一样。

空字符串总是匹配,所以 (?!\1) 总是失败。

关于javascript - 为什么第二个反向引用不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56462541/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com