如何使用str_extract提取含嵌套括号字符串中的完整括号内容
问题产生原因
你使用的正则\\([^()]+\\)$中,[^()]+的规则是匹配连续的、不包含(和)的字符。当目标括号内存在嵌套括号时,内层的(会被该规则拦截,无法完成从最外层左括号到最外层右括号的完整匹配,因此返回NA。
解决方法
使用支持递归匹配的正则表达式即可兼容嵌套括号场景,支持提取任意层级嵌套的末尾括号内容:
stringr包实现代码
library(stringr) # 嵌套括号测试用例 x <- "Wine name (Country A (State))" # 递归匹配末尾完整括号内容 result <- str_extract(x, '\\((?:[^()]++|(?R))*\\)$')
运行后result的值为"(Country A (State))",符合提取要求。
Base R实现代码
如果不依赖stringr包,可使用base R的正则功能开启perl兼容模式实现:
x <- "Wine name (Country A (State))" result <- regmatches(x, gregexpr('\\((?:[^()]++|(?R))*\\)$', x, perl = TRUE))[[1]]
正则逻辑说明
(?R)代表递归调用整个正则表达式本身(?:[^()]++|(?R))*表示匹配逻辑可以是:要么匹配一段不含括号的普通字符,要么递归匹配一对完整的嵌套括号,该逻辑重复0次或多次即可覆盖所有层级的嵌套括号结构- 末尾的
$保证仅匹配字符串最末尾的括号内容
内容的提问来源于stack exchange,提问作者The 'Fe' Man
相关产品推荐
相关产品推荐

