JS Regex lookbehind 在 firefox 和 safari 中不起作用
Posted
技术标签:
【中文标题】JS Regex lookbehind 在 firefox 和 safari 中不起作用【英文标题】:JS Regex lookbehind not working in firefox and safari 【发布时间】:2020-02-16 00:29:23 【问题描述】:我有以下正则表达式,它在 chrome 中工作,但在 firefox 或 safari 中导致错误。我需要修改它以使其工作。谁能帮助一个可怜的灵魂?提前致谢!
正则表达式:/(?=<tag>)(.*?)(?<=<\/tag>)/
基本上,我必须匹配<tag>
和</tag>
之间的任何字符,并且需要保留这两个标签。我将此表达式用作 array.split 的参数。
输入: "The quick brown <tag>fox</tag> jumps over the lazy <tag>dog</tag>"
操作: input.split(regex)
输出: ["The quick brown ", "<tag>fox</tag>", " jumps over the lazy ", "<tag>dog</tag>"]
【问题讨论】:
【参考方案1】:firefox 和 safari 尚不支持lookbehind,您可以使用捕获组(这样我们正在拆分的模式也将添加到输出中)并在<tag> </tag>
上拆分
let str = "The quick brown <tag>fox</tag> jumps over the lazy <tag>dog</tag>"
let regex = /(<tag>.*?<\/tag>)/
console.log(str.split(regex).filter(Boolean))
【讨论】:
它有效。我很欣赏你的回应。我意识到我过度设计了我最初的正则表达式。干杯 在这种情况下不需要使用g
修饰符,因为它是split
的默认行为。【参考方案2】:
也许,
<tag>.*?<\/tag>|[^<>]+
可以正常工作:
测试
function regularExpression(regex, str)
let m, arr = [];
while ((m = regex.exec(str)) !== null)
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex)
regex.lastIndex++;
m.forEach((match, groupIndex) =>
arr.push(match.trim());
console.log(`Found match, group $groupIndex: $match`);
);
return arr;
const expression = /<tag>.*?<\/tag>|[^<>]+/g;
const string = 'The quick brown <tag>fox</tag> jumps over the lazy <tag>dog</tag>';
console.log(regularExpression(expression, string));
如果您希望简化/修改/探索表达式,在regex101.com 的右上角面板中已对此进行了说明。如果您愿意,您还可以在this link 中观看它如何与一些示例输入相匹配。
正则表达式电路
jex.im 可视化正则表达式:
【讨论】:
我试过这个并且它有效,但我觉得第一个答案更简单,足以满足实现要求。感谢您提供可视化!以上是关于JS Regex lookbehind 在 firefox 和 safari 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
PowerShell Lookbehind 的 RegeX 代码在 IP 寻址上不匹配
REGEX - 在字符串之间查找文本 - 第一个可选,但在第一个匹配之前只有第二个
如何测试以确定浏览器是不是支持 JS 正则表达式lookahead/lookbehind?
Redshift / 正则表达式(Positive Lookbehind 和 Positive Lookahead)不起作用