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\.])
样本来源(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]+
我正在尝试在 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\.])
样本来源(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]+