确定字符串中的组

Determine groups in a string

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

例如“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 或正则表达式。有什么想法吗?

你可以简单地使用 RegExp:

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

console.log(res)

你可以使用

(.)*

如:

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

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

与您的实现类似:

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(/(.)*/g)
}

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

\1* 尽可能多次匹配最近捕获的相同字符。

这是它的可视化: