【问题标题】:Determine groups in a string确定字符串中的组
【发布时间】:2020-07-27 04:54:35
【问题描述】:

我正在尝试确定字符串中的组。

例如“AAABBCCCCD”应该有["AAA", "BB", "CCCC", "D"] 根据字符串中的模式作为组。

这是我的简单功能:

const patternGroup = (str) => {
  let cursor = str[0]
  let groups = []
  let currentGroup = ""
  for (let i = 0; i < str.length; i++) {
    let ch = str[i]
    if (ch === cursor) {
      currentGroup += ch
    }
    else {
      groups.push(currentGroup)
      currentGroup = ch
      cursor = ch
    }
  }
  if (currentGroup !== "") {
    groups.push(currentGroup)
  }
  return groups
}

它按预期工作,但我正在寻找一个更简单的函数,可能使用 map/reduce 或正则表达式。有什么想法吗?

【问题讨论】:

  • 在工作代码中寻求设计建议的问题更适合Code Review

标签: javascript regex typescript dictionary reduce


【解决方案1】:

你可以简单地使用 RegExp:

var input = "AAABBCCCCD";
const res = input.match(/([^])(\1*)/g);

console.log(res)

【讨论】:

  • 这个正则表达式?它说find any character , then if that character still exist, catch it until not found the characterlean more about regexp
  • 我建议您将其添加到您的答案中,可以删除 cmets :)
  • [^] 的模式看起来很奇怪,为什么不是.?为什么你有第二个捕获组?
  • [^] 接受每个字符,如空格,但 . 不接受。第二次捕获没有理由:)) 只是为了可读性。
【解决方案2】:

与您的实现类似:

const patternGroupWithReduce = (str) => {
  let currentGroup = ""
  return str.split("").reduce((acc, cur, i) => {
    currentGroup += cur
    if (str[i + 1] !== cur) {
      acc.push(currentGroup)
      currentGroup = ""
    }
    return acc
  }, [])
}

const patternGroupWithRegex = (str) => {
  return str.match(/(.)\1*/g)
}

RegEx /(.)\1/g* 使用捕获组的反向引用。

\1* 尽可能多地匹配最近捕获的同一个字符。

这是它的可视化:

【讨论】:

【解决方案3】:

你可以使用

(.)\1*

如:

let string = "AAABBCCCCD";
let rx = /(.)\1*/g;
let parts = string.match(rx);
console.log(parts);

查看regex101.com 上的表达式演示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多