【发布时间】:2018-06-27 03:22:00
【问题描述】:
我正在尝试在 R 中编写一个匹配某个字符串的正则表达式,直到出现 . 为止。我认为否定的前瞻可能是答案,但我得到了一些误报。
所以在下面的 9 项向量中
vec <- c("mcq_q9", "mcq_q10", "mcq_q11", "mcq_q12", "mcq_q1.factor", "mcq_q2.factor", "mcq_q10.factor", "mcq_q11.factor", "mcq_q12.factor")
grep
grep("mcq_q[0-9]+(?!\\.)", vec, perl = T)
对向量中的前六个元素执行其工作,匹配 "mcq_q11" 但不 "mcq_q2.factor"。不幸的是,虽然它确实匹配最后 3 个元素,但当第二个 q 后面有两个数字时。为什么第二个数字会消除我的负面预测?
【问题讨论】:
-
为什么这个标签是 perl -- 你想要一个 Perl 正则表达式吗? (顺便说一句,这是一个消极的前瞻,而不是“lookbehind”)。
-
第二个数字消除了负前瞻,因为在第二个数字之前 的位置,模式已经成功,包括前瞻,它只检查在那个位置在两个数字之间(除非与
.*配对)。 (从技术上讲,引擎回溯,[0-9]+放弃了一个数字以使 neg-lookahead 成功) -
@zdim 我标记 perl 是因为
perl=T函数中的perl=T参数,并且因为我收到一条自动消息,说如果您识别一种语言,正则表达式问题的机会更大。 -
是的,
perl=T参数允许在 R 中的正则表达式相关函数中使用 perl 样式的正则表达式 -
我将留下我的(已编辑的)Perl 答案,因为它应该适用于您在 R 中的示例。