如何将此正则表达式迁移到 JavaScript

问题描述 投票:0回答:1

我有这个与 PHP 完美配合的正则表达式:

$que = preg_replace("/(?<=^| )([a-z])\\1*(?= |$)\K|([a-z])(?=\\2)/","$3",$que);

此正则表达式删除字符串内重复的字符(例如,

axxd
变为
axd
,但
xxx
仍会变为
xxx
)。我面临的问题是因为它不适用于 JS(我认为负向后查找不适用于 JS)。

更多示例:

  1. 字符串
    aaa baaab xxx
    将变为
    aaa bab xxx
  2. 字符串
    ahhj aaab cc iiik
    将变为
    ahj ab cc ik

你有一个至少有点效率的解决方案吗?我的意思是,我可能会在具有 1k 个字符的字符串上使用此正则表达式,因此如果正则表达式效率不高,浏览器可能会冻结。

javascript regex
1个回答
0
投票

负面回顾不太可能是您的问题,因为几乎所有当前版本的浏览器都支持。您的问题是 JavaScript 正则表达式不将

\K
识别为元序列,而是将其识别为文字
K
。您可以使用此正则表达式解决此问题:

\b([a-z])\1+(?!\1|\b)|([a-z])((?!\2)[a-z])\3+

这匹配任一

\b([a-z])\1+(?!\1|\b)

  • \b
    :单词边界
  • ([a-z])
    :一封信,在第 1 组中捕获
  • \1+
    :捕获的字母的一次或多次重复
  • (?!\1|\b)
    :前瞻断言下一个位置不是捕获的字母或单词边界的另一个重复

([a-z])((?!\2)[a-z])\3+

  • ([a-z])
    :一封信,在第 2 组中捕获
  • ((?!\2)[a-z])
    :与先前捕获的字母不同的另一个字母,在第 3 组中捕获
  • \3+
    :捕获的字母的多个重复之一

正则表达式的第一部分将捕获单词开头的重复字母;第二部分捕获单词中间或末尾的重复字母。

然后您可以替换为

$1$2$3
,它将用其自身的一个副本替换正则表达式匹配的任何重复字母。

regex101 上的正则表达式演示

© www.soinside.com 2019 - 2024. All rights reserved.