【问题标题】:Match Non-Consecutive Duplicate Characters匹配不连续的重复字符
【发布时间】:2019-07-23 20:05:35
【问题描述】:

例如:

我想匹配被其他字符分隔的重复字符:

  • 匹配的stress 应该返回sss
  • 匹配的lambda 应该返回aa
  • 匹配的moonmen 应该返回moonmn

我很接近,通过使用前瞻获取每个重复项的第一个字符:

Regex101 link

['stress','lambda','moonmen'].forEach( (e) => {
  console.log( e.match(/(.)(?=.*\1)/g) )
} )

但是我怎样才能得到所有重复的字符呢?

【问题讨论】:

  • 正则表达式通常不适用于此类任务,它效率低下,并且无论如何都需要代码调整,因为您无法“在一次正则表达式中”实现这一目标。
  • 如果您先对字符进行排序,则可以简化正则表达式。

标签: javascript regex


【解决方案1】:

您的模式匹配具有重复的最新字符。

作为替代方案,知道它们有重复项,您可以使用negated character class 删除所有非重复项。

let pattern = /(.)(?=.*\1)/g;
[
  "stress",
  "lambda",
  "moonmen"
].forEach(s => {
  let regex = new RegExp("[^" + [...new Set(s.match(pattern))].join('') + "]+", "g");
  console.log(s.replace(regex, ''));
});

如果要考虑字符串中的特殊字符,可以使用this page 上的函数来转义具有特殊含义的字符。

【讨论】:

    【解决方案2】:

    这很复杂,我猜这个表达式可能更接近一步:

    (?:(.)(?=(.*)\1))
    

    DEMO

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-04
      • 1970-01-01
      • 2018-01-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多