如何修改正则表达式捕获指定词到第二个分号间的内容?
R语言正则表达式捕获指定字段解决方案
原正则str_match(x, "Cartoon Car \\(\\s*(.*?)\\s*;")[,2]仅捕获到姓名,是因为.*?是非贪婪匹配,遇到第一个;就终止匹配。要捕获DAFFY DUCK; daffyduck@disney.com(姓名+邮箱),可通过以下两种方法修改正则:
方法一:精准匹配非分号字符
利用[^;]+匹配不含分号的字段,覆盖姓名和邮箱两个部分:
library(stringr) x <- "Focal Point (BUGS BUNNY; bugs.bunny@looonytune.car; 888-555-1111)\nCartoon Car (DAFFY DUCK; daffyduck@disney.com; 888-555-1112)\nCartoon Official Rep (GOOFY NONAME; goofy.noname@loonytune.car; 888-555-1113)" result <- str_match(x, "Cartoon Car \\(\\s*([^;]+;\\s*[^;]+)\\s*;")[,2] print(result) # 输出: "DAFFY DUCK; daffyduck@disney.com"
[^;]+:匹配任意不含分号的字符串,第一个匹配姓名,第二个匹配邮箱\\s*:匹配任意数量的空格,兼容字段间的空格差异
方法二:使用零宽断言提取
通过正向/反向预查限定提取范围,无需额外捕获分组:
result <- str_extract(x, "(?<=Cartoon Car \\(\\s)[^;]+;\\s*[^;]+(?=\\s*;)") print(result) # 输出: "DAFFY DUCK; daffyduck@disney.com"
(?<=Cartoon Car \\(\\s):反向预查,确保目标内容前是Cartoon Car (及任意空格(?=\\s*;):正向预查,确保目标内容后是任意空格和分号- 中间的匹配规则与方法一一致,直接提取所需内容
内容的提问来源于stack exchange,提问作者darth_chaos
相关产品推荐
相关产品推荐

