【问题标题】:Regex is not compliant for Safari (lookbehind)正则表达式不兼容 Safari(后视)
【发布时间】:2022-08-10 09:07:02
【问题描述】:

我在使正则表达式 Safari 兼容时遇到问题。

不幸的是,在 Safari 上的 JS 中不能使用lookbehind 功能: https://caniuse.com/?search=lookbehind

这就是为什么我必须将我的正则表达式转换为一个做同样但没有后视的正则表达式。

这是我在lookbehind中使用的正则表达式:

((?<!\\\\)}})

结果看起来像(粗体是匹配):

%{{你好,这是一个带有转义 \\}} 的测试,结尾应该在这里:}}

请注意 \\}} 不能匹配。

如果您想尝试,可以使用以下链接:https://regexr.com/6qq8k

有没有人知道如何做到这一点,而无需向后看?

当然,我之前已经在互联网上搜索过解决方案。经过一天多的搜索,我想在 StackOverflow 上尝试一下。

问题是,我正在使用 JS-Library (codemirror),我必须在其中传递正确的正则表达式。这意味着我以后无法修改匹配的结果,这会以某种方式排除我找到的所有解决方案。

所以我需要一个正则表达式,它在没有任何额外 JS 代码的情况下排除不需要的字符并找到正确的匹配项。

提前致谢

  • 嗨@Andreas,感谢您的回答。当然,我之前已经在网上搜索过解决方案。问题是,我正在使用 JS-Library,我必须在其中传递正确的正则表达式。这意味着我以后无法修改匹配的结果。所以我需要一个正则表达式,它在没有任何额外 JS 代码的情况下排除不需要的字符并找到正确的匹配项。
  • \“问题是,我使用的是 JS-Library,...\”-> How do I ask a good question? -> 在问题本身中添加相关信息。\"我已经在寻找解决方案了......\"-> How much research effort is expected of Stack Overflow users? -> 显示在问题本身你已经做了(足够的)研究和/或你试图自己解决这个问题。
  • 还有一个想法:如果在实践中,您的}} 总是在一个字母之后(不是空格或特殊字符,如括号、冒号或换行符),您可以使用\\b}} :) 如果前面有任何字符,那么我很漂亮确定你运气不好:/
  • 嘿@Jay,谢谢你的尝试。不过看来我倒霉了^^}}前面什么都可以写。

标签: javascript regex safari compatibility regex-lookarounds


【解决方案1】:

从您的问题来看,除了识别未转义的尾随 }} 模式之外,您还不清楚您想要完成什么,这没有使用负面的后视。

这是一个带有假设的示例的解决方案:

  • 您有一个包含一个或多个%{{...}} 模式的字符串
  • 您想对每个模式应用一些转换
  • 该示例将每个%{{...}} 模式替换为&lt;b&gt;...&lt;/b&gt; 粗体标签

[
  "%{{Hello, escaping \\}}, and end here:}}",
  "aaa %{{Hello, escaping \\}}, and end here:}} zzz",
  "aaa %{{Hello, escaping \\}}, and end here:}} bbb %{{Another hello}} zzz"
].forEach(str => {
  console.log(str.replace(/(%\{\{)(.*?[^\\])(\}\})/g, function(m, p1, p2, p3) {
    return '<b>' + p2 + '</b>'
  }));
});

输出:

<b>Hello, escaping \}}, and end here:</b>
aaa <b>Hello, escaping \}}, and end here:</b> zzz
aaa <b>Hello, escaping \}}, and end here:</b> bbb <b>Another hello</b> zzz

正则表达式的解释:

  • (%\{\{) -- 捕获组 #1:%{{ 模式
  • (.*?[^\\]) -- 捕获组 #2:对任何文本进行非贪婪扫描,直到 }} 之前,不包括 \}}
  • (\}\}) -- 捕获组#3:}} 模式
  • /g -- 全局,例如处理不止一次

【讨论】:

  • @Marcel Frank:这是否满足您的需求?如果是这样,您愿意接受答案吗?
猜你喜欢
  • 2017-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-10
  • 2016-02-02
  • 1970-01-01
  • 2020-06-22
  • 1970-01-01
相关资源
最近更新 更多