R语言如何编写正则表达式提取符合指定后缀要求的两个数字
问题解决方案
错误原因
你编写的正则未匹配两个数字之间的A/分隔内容,两个捕获组直接相邻,无法匹配到存在中间字符的目标结构,因此无法命中符合规则的字符串。
正确实现
正则表达式
使用如下正则即可同时满足两个匹配条件,仅当两个后缀规则都满足时才会捕获到对应数字:
^(\d+)A\/(\d+)B$
规则说明:
^匹配字符串起始位置,避免前缀冗余内容干扰- 第一个捕获组
(\d+)提取后缀为A/的数字 - 固定匹配两个数字中间的分隔符
A/ - 第二个捕获组
(\d+)提取后缀为B的数字 $匹配字符串结束位置,避免后缀冗余内容干扰
如果需要在长文本中提取符合该规则的子串,可去掉首尾的^和$。
R语言代码示例
base R 实现(开启perl=TRUE)
# 测试用例 test_str <- c("30A/305B", "30/305B", "30A/305") # 正则规则,注意R中反斜杠需要转义 pattern <- "^(\\d+)A/(\\d+)B$" # 执行匹配 match_res <- regmatches(test_str, regexec(pattern, test_str, perl = TRUE)) # 格式化输出:匹配成功返回两个数字,失败返回NULL output <- lapply(match_res, function(item) { if (length(item) == 3) as.integer(item[-1]) else NULL })
执行后output结果为:
[[1]] [1] 30 305 [[2]] NULL [[3]] NULL
完全符合需求。
stringr 包实现(更简洁)
library(stringr) test_str <- c("30A/305B", "30/305B", "30A/305") pattern <- "^(\\d+)A/(\\d+)B$" match_res <- str_match(test_str, pattern)[, 2:3]
执行后匹配失败的行会返回NA,按需过滤即可。
内容的提问来源于stack exchange,提问作者Fabio Correa
相关产品推荐
相关产品推荐

