如何从长字符串中提取多个以/Home开头、/Specs结尾的路径?
解决从字符串中提取所有符合规则路径的问题
我明白你遇到的问题了——之前的正则写法因为贪婪匹配的特性,只能捕获到最后一个符合条件的路径。咱们来一步步修正它:
问题根源
你原来的正则.*(/Home/.*/Specs).*里,.*是贪婪匹配,它会尽可能多地匹配字符,所以整个表达式会从字符串开头一直匹配到最后一个/Specs,最终只捕获到最后一条路径。
解决方案
我们需要调整正则,让它匹配每一个独立的/Home开头、/Specs结尾的路径,关键是用非贪婪量词.*?替代贪婪的.*,同时去掉前后多余的.*(因为我们要找所有匹配项,不需要把整个字符串包裹起来)。
方法1:使用str_match_all
# 定义原始字符串 miserie <- "/Home/homes?query=123 qdf /Home/123/home-name/Specs , homeurl : http://www.example.com/ },{ id :1, y : 02 , p :false, url : /Home/456/home-name/Specs" # 修正后的正则表达式 pat <- "/Home/.*?/Specs" # 提取所有匹配项 result <- str_match_all(miserie, pat)[[1]] print(result)
运行后会得到:
[1] "/Home/123/home-name/Specs" "/Home/456/home-name/Specs"
方法2:使用stringr包的str_extract_all(更简洁)
如果你用stringr包,代码会更直观:
library(stringr) # 直接提取所有符合规则的路径 result <- str_extract_all(miserie, "/Home/.*?/Specs")[[1]] print(result)
输出和上面一致。
原理说明
.*?是非贪婪匹配,它会在找到第一个/Specs时就停止匹配,这样就能逐个捕获所有符合/Home开头、/Specs结尾的路径。str_match_all和str_extract_all都会返回所有匹配到的结果,而不是只返回最后一个。
内容的提问来源于stack exchange,提问作者BroQ
相关产品推荐
相关产品推荐

