【问题标题】:Make regex safari compatible by removing negative lookbehind通过删除负面的lookbehind使正则表达式Safari兼容
【发布时间】:2021-10-10 09:34:08
【问题描述】:

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

这是正则表达式:

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

对于 OR 运算符之前的第一组,即 (?&lt;!\[(?=#\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)

【问题讨论】:

  • 你想和(?&lt;!\[(?=@\S+\s+\S+]))@(\S+\s+\S+)匹配什么?你能添加一些有效和无效的匹配吗?
  • @anubhava 是的,很抱歉没有指定,我正在尝试匹配如下所示的模式:\@word1 word2,但它没有被方括号包围([\@word1 word2] 会失败)。 (不带反斜杠)

标签: javascript regex regex-group


【解决方案1】:

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

例如:

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

Regex demo

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-10
    • 2012-02-08
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    相关资源
    最近更新 更多