我想从r中的一个字符串中提取子字符串。我用regex101测试了它,它确实提取了我想要的子字符串,但它也匹配了字符串中的每一个字符,并给了我一个矩阵列表,它试图匹配字符串中的每一个字符,但由于它只匹配了几个,我得到了很多空字符串。我只想得到匹配结果,没有列表或矩阵或其他。
我有一个参考书目,想提取每一个参考卷,一个问题或一个数字(包括以下数字,罗马和阿拉伯语)。所以它mathes卷,问题和数字1以及I或II。有时thre是多个在我的字符串以及(卷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)
字符串
1条答案
按热度按时间tzcvj98z1#
主要问题是
|
之后的模式部分被一个可选的非捕获组 Package ,即使所有其他的拼写错误都被修复了,这个问题仍然需要解决。OR运算符两端的数字匹配部分是相同的,因此您可以将两个备选项合并为一个,并简单地使用
字符串
参见R demo online
图案看起来像
型
请参阅the regex demo。* 详细信息 *:
\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
,然后是0到3个I
s,然后是可选的X
,可选的L
,C 0到3个,然后是可选的D
和可选的M
。