我有这个与 PHP 完美配合的正则表达式:
$que = preg_replace("/(?<=^| )([a-z])\\1*(?= |$)\K|([a-z])(?=\\2)/","$3",$que);
此正则表达式删除字符串内重复的字符(例如,
axxd
变为axd
,但xxx
仍会变为xxx
)。我面临的问题是因为它不适用于 JS(我认为负向后查找不适用于 JS)。
更多示例:
aaa baaab xxx
将变为 aaa bab xxx
ahhj aaab cc iiik
将变为 ahj ab cc ik
你有一个至少有点效率的解决方案吗?我的意思是,我可能会在具有 1k 个字符的字符串上使用此正则表达式,因此如果正则表达式效率不高,浏览器可能会冻结。
负面回顾不太可能是您的问题,因为几乎所有当前版本的浏览器都支持。您的问题是 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
,它将用其自身的一个副本替换正则表达式匹配的任何重复字母。