确定字符串中的组
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* 尽可能多次匹配最近捕获的相同字符。
这是它的可视化:
我正在尝试确定字符串中的组。
例如“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* 尽可能多次匹配最近捕获的相同字符。
这是它的可视化: