我想从 r 中的字符串中提取子字符串。我用 regex101 测试了它,它确实提取了我想要的子字符串,但它也匹配字符串中的每个其他字符,并为我提供了一个带有矩阵的列表,其中它尝试匹配字符串中的每个字符,但因为它只匹配几个,我得到很多空字符串。我只想要匹配结果,不需要列表或矩阵或其他。
我有一个参考书目,想要提取对一卷、一期或一个数字的所有引用(包括以下数字,罗马数字和阿拉伯数字)。因此,它对卷、期和编号 1 以及 I 或 II 进行数学计算。有时我的字符串中也会有多个这样的字符串(第 3 卷,第 2 期)。 谁能告诉我为什么它检查每个字符?
这是我到目前为止的代码:
string <- 'ABC (2013c), Something Something Text (Volume II): Some more blabla, the usual, end of string'
pattern <- "[V|v]ol(?:ume)?\\s*(\\d+|(V?I{0,3}X?L?C{0,3}D?M?))|(?:\\s+(Issue|No|Nr|nr|no|Number)\\s*(\\d+|V?I{0,3}X?L?C{0,3}D?M?))?"
matches <- str_match_all(string , pattern)
主要问题是
|
之后的模式部分被可选的非捕获组包裹,即使所有其他拼写错误都已修复,该问题仍然需要解决。
OR 运算符两端的数字匹配部分是相同的,因此您可以将两种选择合并为一个并简单地使用
string <- 'ABC (2013c), Something Something Text (Volume II): Some more blabla, the usual, end of string'
rx <- paste0("\\b(?:[Vv]ol(?:ume)?|Issue|No|Nr|nr|no|Number)\\s*(?:\\d+|V?I{0,3}X?L?C{0,3}D?M?)")
library(stringr)
str_extract_all(string, rx)
## => [[1]]
## [1] "Volume II"
在线观看 R 演示
图案看起来像
\b(?:[Vv]ol(?:ume)?|Issue|No|Nr|nr|no|Number)\s*(?:\d+|V?I{0,3}X?L?C{0,3}D?M?)
请参阅正则表达式演示。 详情:
\b
- 单词边界(?:[Vv]ol(?:ume)?|Issue|No|Nr|nr|no|Number)
- vol
、Vol
、volume
、Volume
、Issue
、No
、Nr
、nr
、no
或 Number
\s*
- 零个或多个空格(?:\d+|V?I{0,3}X?L?C{0,3}D?M?)
- 一位或多位数字或可选的 V
,然后是零到三个 I
,然后是可选的 X
,可选的 L
,C 出现零到 3 次,然后是可选的 D
和可选的 M
。