大家好,今天我们来讲解一下如何提取嵌套括号里面内容的问题。这类问题也是困扰很多小伙伴许久的疑问。
嵌套括号指的是 “括号内部包含其他括号”的层级结构,外层括号包裹内层括号,形成多层包含关系。
核心特征:至少存在两层括号,且内层括号完全“藏”在外层括号的内部(而非并列或交叉)。
比如:(外层(中层(内层)))(3层嵌套)
如下图所示:
A列数据是包含嵌套括号的数据。其中(apple)和(pear)分别是“苹果”和“梨”的英文释义,表示内层括号;而整体的(苹果(apple)梨(pear))是“水果”的释义,表示外层括号。
我们想要分别提取外层括号内容:
(苹果(apple)梨(pear))

提取内层括号内容:
(apple)和(pear)

首先我们提取外层括号。
外层括号是非常容易理解并解决的。
我们直接输入公式:
=REGEXP(A2,"\(.+\)")
.+:表示任意的一个或多个字符。
\(:表示转义后的左括号。
\):表示转义后的右括号。
\(.+\):整体表示括号内的任意内容。
这时候REGEXP函数用默认的“贪婪模式”,尽可能多的匹配括号里面的内容,就会很容易的将最左边第一个左括号到右边最后一个右括号及之间的内容提取出来,这就是外层括号的内容。

提取内层括号,我们可以用“盒子理论”来理解。
其实嵌套括号的提取,就像在“找盒子里的东西”。
REGEXP函数的作用就是根据你想要的“盒子”(内层小盒子还是外层大盒子),按规则把“盒子里的东西”取出来。
比如一个大盒子里套着两个小盒子:
(苹果(apple)梨(pear))
只想拿最里面小盒子里的(apple)和(pear),小盒子里没有更小的盒子了。

最小盒子规则怎么定呢?
我们需要告诉REGEXP函数:“找一个最小盒子,里面不能有其他盒子”。
对应到字符串里,就是:
最小盒子左边是( <左括号>
最小盒子右边是) <右括号>
最小盒子中间的内容,不能有任何括号,因为如果有括号,就说明里面还有更小的盒子,就不是最小的了。
所以我们这样输入REGEXP正则函数及正则表达式:
=REGEXP(A2,"\([^()]*\)")
正则表达式部分:
\([^()]*\)
我们不用死记硬背,理解逻辑就行:
\( 和 \) 就是最小盒子的左右边,括号需要用\转义,告诉REGEXP函数这是最小盒子的边界,不是普通字符。
[^()]表示:不是括号的字符。*表示:可以有0个或多个。
[^()]*:整体就是盒子里面不能再有其他盒子了。
PS:
[]的语法规则决定了其内部大部分元字符“去特殊化”:
外部:()是分组符号,需转义\(/\)才能表示字面括号;
内部:()仅表示普通字符(与),无需转义,直接写入[]即可。
REGEXP函数会按上面的盒子规则找到最小的盒子(apple)和(pear)。
因为只有(apple)和(pear)这两个最小的盒子:里面不会再有包含括号的内容了。

PS:
我们继续增加难度,假如我们的嵌套括号是3层的,如下图所示,我们只想提取“中层括号”的内容。

我们继续分盒子。
小盒子:
最内层,无嵌套,如(豫)和(冀)→对应“最小的盒子,里面没有更小的盒子”。
中盒子:
中间层,包含小盒子,如(apple(豫))和(pear(冀))→对应“装着小盒子的中等盒子”。
大盒子:最外层,包含中盒子,如(苹果(apple(豫))梨(pear(冀)))→对应“装着中盒子的最大盒子”。
目标:提取“中盒子”里的内容,即(apple(豫))和(pear(冀))。

中盒子的唯一特征是 “它里面一定装着一个小盒子”。就像你要在一堆盒子里找“装着小盒子的中等盒子”,需要先确定“小盒子长什么样”,再找“包裹小盒子的中盒子”。
所以我们这样输入公式:
=REGEXP(A2,"\([^()]*\([^()]*\)[^()]*\)")
\([^()]*\) 小盒子(同上面提取内层括号原理)
匹配最内层无嵌套括号,是中盒子的“核心标志”,必须包含。
[^()]* 中盒子左侧内容
匹配小盒子左边的“非括号字符”,[^()] 确保这些字符中没有其他括号,避免误判为大盒子,* 表示“可以有0个或多个”,即允许左侧内容为空。
[^()]* 中盒子右侧内容
匹配小盒子右边的“非括号字符”,逻辑同左侧内容,确保无其他括号,* 允许右侧内容为空。
最外侧两端的“边界”:用 \( 和 \) 标记中盒子的左右盒盖。
这样就确定了只有(apple(豫))和(pear(冀))满足括号里面只包含一组带括号的内容。

本站是社保查询公益性网站链接,数据来自各地人力资源和社会保障局,具体内容以官网为准。
定期更新查询链接数据 苏ICP备17010502号-11