如何仅用gsub保留字符串中的abc\d{2}模式并删除其他字符
用
gsub提取abc\d{2}模式并得到目标结果 你的问题出在原来的正则表达式只是用了负前瞻断言,但这个断言本身不会匹配任何字符,所以gsub找不到要替换的内容,自然没法修改原字符串。咱们换个思路,用捕获组定位要保留的内容,再把其他部分替换掉,就能得到你想要的结果了。
方法一:分两步处理(简洁易读)
先从每个路径里提取出abc\d{2}部分,再把结果用空格拼接:
smple_paths <- c("/path/path/path/abc22/path/path", "/apath/apath/paath/abc11/something/path") # 提取每个路径中的目标模式 extracted <- gsub(pattern = "^.*?(abc\\d{2}).*$", replacement = "\\1", x = smple_paths, perl = TRUE) # 拼接成空格分隔的字符串 final_result <- paste(extracted, collapse = " ") print(final_result) # [1] "abc22 abc11"
正则说明:
^.*?(abc\\d{2}).*$:^匹配字符串开头,$匹配结尾,确保我们处理整个字符串.*?非贪婪匹配任意字符,直到遇到我们要找的abc\d{2}(abc\\d{2})捕获组,专门锁定"abc"加两位数字的内容\\1在替换时代表第一个捕获组的内容,也就是我们要保留的部分
方法二:纯gsub处理(符合"非gsub不接受"的严格要求)
如果想要完全只用gsub完成,我们可以先把向量合并成一个字符串,再一次性提取所有目标模式:
smple_paths <- c("/path/path/path/abc22/path/path", "/apath/apath/paath/abc11/something/path") # 合并向量并提取所有目标模式,最后去除末尾多余空格 final_result <- gsub( pattern = "\\s$", replacement = "", x = gsub( pattern = ".*?(abc\\d{2})|.*", replacement = "\\1 ", x = paste(smple_paths, collapse = " "), perl = TRUE ) ) print(final_result) # [1] "abc22 abc11"
正则说明:
- 内层
gsub的.*?(abc\\d{2})|.*是分支匹配:要么找到并捕获abc\d{2},要么匹配剩下的无关内容;替换时把捕获到的内容加空格,无关内容替换为空 - 外层
gsub的\\s$用来去除最后多余的空格
为什么原来的代码无效?
你用的(?!abc\\d{2})是负前瞻断言,它只是检查当前位置后面不是abc\d{2},但这个断言本身不匹配任何字符——gsub只能替换匹配到的字符,所以自然不会对原字符串做任何修改。
内容的提问来源于stack exchange,提问作者Konrad
相关产品推荐
相关产品推荐

