R中使用正则搜索提取BibTeX条目标题字符串的方法
问题修复方案
你原有代码报错的核心原因是两个:一是默认TRE正则引擎下{属于特殊量词字符,你的转义写法不符合引擎规则;二是正则里写了不存在的|字符匹配逻辑,完全无法对应你的BibTeX文本结构。
基础R实现(无需安装额外包)
直接使用sub()完成整列提取即可,正则逻辑专门适配「取={`后第一个}前的内容、忽略后续所有字段」的需求:
data$Title <- sub(".*=\\{([^}]+)\\}.*", "\\1", data$Title)
正则逻辑说明
.*:匹配字符串开头到={`标记前的所有内容=\\{:精确匹配定位符={`([^}]+):捕获组,匹配连续1个及以上的非}字符,遇到第一个}就自动终止匹配,天然适配不同行BibTeX字段数不一致的情况\\}.*:匹配第一个}以及后续所有内容- 替换为
\\1即输出捕获到的标题文本
用你提供的样例测试,运行结果完全符合预期:
test_bib <- "={Proofs that yield nothing but their validity or all languages in NP have zero-knowledge proof systems},\\n author={Goldreich, Oded and Micali, Silvio and Wigderson, Avi},\\n journal={Journal of the ACM (JACM)},\\n volume={38},\\n number={3},\\n pages={690--728},\\n year={1991},\\n publisher={ACM New York, NY, USA}\\n}" sub(".*=\\{([^}]+)\\}.*", "\\1", test_bib) # 输出:[1] "Proofs that yield nothing but their validity or all languages in NP have zero-knowledge proof systems"
tidyverse 实现(更直观的写法)
如果日常使用stringr包做文本处理,可以用正向预查直接提取目标内容,不需要写替换逻辑:
library(stringr) data$Title <- str_extract(data$Title, "(?<=\\=\\{)[^}]+")
这里(?<=\\=\\{)表示只匹配前面紧邻={`的文本,后续提取连续非}字符,逻辑更易读,执行效果和基础R写法完全一致。
内容的提问来源于stack exchange,提问作者bvecc
相关产品推荐
相关产品推荐

