Negative Lookahead 因字符串中的额外数字而无效

Negative Lookahead Invalidated by extra numbers in string

我正在尝试在 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"。不幸的是,当第二个 q 后面有两个数字时,它 确实 匹配最后 3 个元素。为什么第二个数字会取消我的负面预测?

如果你要捕捉到一个点,那么你应该使用这个:

mcq_q[0-9]+(?![\d\.])

Demo

样本来源(run here

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("mcq_q[0-9]+(?![\d\.])", vec, perl = T)

我们可以在没有任何环视的情况下使用它来匹配数字 ([0-9]+) 之后不属于 . 的零个或多个字符,直到字符串结尾 ($)

grep("mcq_q[0-9]+[^.]*$", vec, value = TRUE)
#[1] "mcq_q9"  "mcq_q10" "mcq_q11" "mcq_q12"

正如评论中所解释的那样,负面的前瞻是棘手的。但你不需要它

/mcq_q[0-9]+(?:$|[^.0-9])/

这要求一串数字后跟字符串结尾或非[.,digit] 字符。因此它将允许 mcq_q12a 等。如果您允许的字符串可能仅以数字结尾删除 |[^...],那么也不需要非捕获组 (?:...),因为 /mcq_q[0-9]+$/

仅在 Perl 中测试过,因为问题已被标记。它应该与你在 R 中的示例相同。

我想你希望你的否定前瞻首先扫描整个字符串,确保它看不到 "dot":

(?!.*\.)mcq_q[0-9]+

https://regex101.com/r/f5XxR2/2/