通过删除负面后视使正则表达式 safari 兼容

Make regex safari compatible by removing negative lookbehind

据我所知,负面回顾在 safari 中不起作用,因此我正在尝试修改我的正则表达式以使其与 safari 兼容。

这是正则表达式:

(?<!\[(?=#\w+]))#\w+|(?<!\[(?=@\S+\s+\S+]))@(\S+\s+\S+)

对于 OR 运算符之前的第一组,即 (?<!\[(?=#\w+]))#\w+,我尝试了以下操作:((?!\[)(?=#\w+]))#\w+.

我想匹配任何主题标签词(# 后跟任何词,例如#something),但前提是该组没有被方括号包围(例如 [#something])。上面的后一个表达式不起作用,因为它也匹配方括号中的单词。

此外,我不太确定负面回顾是否是唯一在 safari 中不起作用的东西,所以请注意。我不擅长正则表达式,所以非常感谢您的帮助。

编辑:根据第四只鸟的回答,我也成功推导出了第二部分的结果,整个正则表达式如下所示:

\[#[^\]\[]*]|(#\w+)|(\[@[^\]\[]\S+\s+\S+]|(@\S+\s+\S+))

并且可以用这个捕获适当的组:

Array.from(str.matchAll(regex), m => m[1] || m[3]).filter(Boolean)

您可以通过匹配来排除匹配方括号之间的主题标签,并使用交替和捕获组来捕获您想要的内容。

例如:

\[#[^\]\[]*]|(#\w+)

Regex demo

const regex = /\[#[^\]\[]*]|(#\w+)/g;
const str = `[#something]
#something`;
console.log(Array.from(str.matchAll(regex), m => m[1]).filter(Boolean));