从方括号中提取零件 执行正则表达式方括号与不方括号按正确顺序进行

有一个字符串,其中有些部分带有括号标记:

abc(de)f(uv)xyz

如何将其拆分为以下部分:

abc | false
de | true
f | false
uv | true
xyz | false

其中 true 表示带括号的部分,而 false 表示不带括号的部分。

N.B。括号仅用于标记目的。嵌套,不成对的括号和其他复杂的方案是不可能的。

zpr6j 回答:从方括号中提取零件 执行正则表达式方括号与不方括号按正确顺序进行

正则表达式

鉴于括号序列被保证是有效的并且不包含嵌套序列,我们可以使正则表达式保持简单:

\(?([^()]+)\)?

  1. \(?-(可选)接受左括号
  2. ([^()]+)-捕获不是左括号或右括号的所有内容
  3. \)?-(可选)接受右括号

代码

执行正则表达式

执行正则表达式(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'))

本文链接:https://www.f2er.com/2609825.html

大家都在问