如何让这个积极的后向正则表达式在 Safari 中运行

Posted

技术标签:

【中文标题】如何让这个积极的后向正则表达式在 Safari 中运行【英文标题】:How to make this positive lookbehind regular expression run in Safari 【发布时间】:2022-01-22 16:18:27 【问题描述】:
(?<=a)(?=b)|(?<=b)(?=a)

我使用这个正则表达式插入一个“|”在每对 'ab' 或 'ba' 之间,例如:

ab -> a|b
aba -> a|b|a
ababa -> a|b|a|b|a
aaabbbaaabaaaaaab -> aaa|bbb|aaa|b|aaaaaa|b

但它在 Safari 中不起作用,因为它不支持正向回溯。

是否有其他方法可以更改此正则表达式,使其可以在 Safari 中运行?

【问题讨论】:

【参考方案1】:

你可以使用

.replace(/(a)(?=b)|(b)(?=a)/g, '$1$2|')

请参阅regex demo online。

详情

(a)(?=b) - 如果右侧有 b,则将 a 匹配并捕获到第 1 组 | - 或 (b)(?=a) - 如果在当前位置的右侧有 a,则将 b 匹配并捕获到第 2 组。

替换为第 1 组 + 第 2 组 vaue(匹配时只有其中一个会填充文本)和一个 | 字符。

请看下面的 JS 演示:

var rx = /(a)(?=b)|(b)(?=a)/g;
var strs = ['aba', 'abab', 'aaabbbababab'];
for (var s of strs) 
   console.log(s, '=>', s.replace(rx, '$1$2|'));

【讨论】:

【参考方案2】:

这里不需要环视。我们可以对abba 做两个独立的贪心替换:

var input = "aaabbbaaabaaaaaab";
var output = input.replace(/ab/g, "a|b").replace(/ba/g, "b|a");
console.log(output);

【讨论】:

喜欢:aba -> a|b|a abab -> a|b|a|b aaabbbababab -> aaa|bbb|a|b|a|b|a|b @MDK.dc 因此,在一开始就为您的问题添加示例输入和输出的重要性。

以上是关于如何让这个积极的后向正则表达式在 Safari 中运行的主要内容,如果未能解决你的问题,请参考以下文章

python里使用正则表达式的后向搜索肯定模式

python里使用正则表达式的后向搜索肯定模式

python里使用正则表达式的后向搜索肯定模式

正则表达式否定后向在 JavaScript 中无效 [重复]

C# 中的正则表达式,否定后向表达式

非固定长度的正则表达式负回溯