regex 正则表达式与Safari不兼容(lookbehind)

kknvjkwl  于 2022-11-18  发布在  其他
关注(0)|答案(1)|浏览(295)

使正则表达式与Safari兼容时遇到问题。
遗憾的是,lookbehind功能无法在Safari上的JS中使用:https://caniuse.com/?search=lookbehind
这就是为什么我必须把我的正则表达式转换成一个做同样事情的正则表达式,但是没有lookbehind。
下面是我在lookbehind中使用的正则表达式:

((?<!\\)}})

结果如下所示(粗体为匹配项):
%{{Hello,这是一个带转义的测试}},结尾应该在这里:}}
请注意,}}不能匹配。
如果您想尝试,可以使用以下链接:https://regexr.com/6qq8k
有没有人知道如何做到这一点,没有一个回头看?
当然,我之前已经在网上搜索过解决方案,经过一天多的搜索,我想在StackOverflow上试试。
问题是,我使用的是一个JS库(codemirror),我必须在其中传递正确的正则表达式。这意味着我不能修改匹配的结果,这就排除了我找到的所有解决方案。
因此,我需要一个正则表达式,它可以排除不需要的字符,而不需要任何额外的JS代码,并找到正确的匹配。
先谢了

tjjdgumg

tjjdgumg1#

从您的问题中,我们不清楚除了识别未转义的尾随}}模式之外,您还想完成什么,这不需要使用负lookbehind。
下面是一个解决方案示例,其中包含一些假设:

  • 字符串包含一个或多个%{{...}}模式
  • 您需要对每个模式应用一些转换
  • 该示例将每个%{{...}}模式替换为<b>...</b>粗体标记
[
  "%{{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-全局,例如处理多次
    2022年11月1日更新:

如果要从字符串中提取多个手柄,请使用以下命令:

"aaa %{{Hello, escaping \\}}, and end here:}} bbb %{{Another hello}} zzz".match(/%\{\{.*?[^\\]\}\}/g);

...它将返回两个匹配项:

[ '%{{Hello, escaping \\}}, and end here:}}', '%{{Another hello}}' ]

正则表达式说明:

  • %\{\{--手把起点(%{{
  • .*?-非贪婪扫描
  • [^\\]-不是反斜杠的单个字符
  • \}\}--手把端部(}}

相关问题