有一个字符串,其中有些部分带有括号标记:
abc(de)f(uv)xyz
如何将其拆分为以下部分:
abc | false
de | true
f | false
uv | true
xyz | false
其中 true 表示带括号的部分,而 false 表示不带括号的部分。
N.B。括号仅用于标记目的。嵌套,不成对的括号和其他复杂的方案是不可能的。
有一个字符串,其中有些部分带有括号标记:
abc(de)f(uv)xyz
如何将其拆分为以下部分:
abc | false
de | true
f | false
uv | true
xyz | false
其中 true 表示带括号的部分,而 false 表示不带括号的部分。
N.B。括号仅用于标记目的。嵌套,不成对的括号和其他复杂的方案是不可能的。
鉴于括号序列被保证是有效的并且不包含嵌套序列,我们可以使正则表达式保持简单:
\(?([^()]+)\)?
\(?
-(可选)接受左括号([^()]+)
-捕获不是左括号或右括号的所有内容\)?
-(可选)接受右括号执行正则表达式(execAll(pattern,text)
)后,我们会得到
const matches = execAll(pattern,text)
[
['abc','abc'],['(de)','de'],['f','f' ]
['(uv)','uv'],['xyz','xyz']
]
每个条目的索引0
是匹配的文本,索引1
是捕获的组。
查看索引0
的第一个字符可以告诉我们它是否是一个组:
matches[0][0] === '(' // false
matches[1][0] === '(' // true
我们要先输入文本,然后再输入布尔值:
matches.map(([bracket,group]) => [group,bracket[0]==='('])
[
['abc',false],['de',true ],false]
['uv',false]
]
完成!
const execAll = (pattern,str) => {
const result=[]
let match
while((match = pattern.exec(str))) {
result.push(match)
}
return result
}
const extractGroups = text => {
const pattern = /\(?([^()]+)\)?/g
const matches = execAll(pattern,text)
return matches
.map(([bracket,bracket[0]==='('])
}
console.log(extractGroups('abc(de)f(uv)xyz'))