【发布时间】:2017-10-29 12:06:05
【问题描述】:
我希望正则表达式模式 ab{,2}c 仅匹配 a 后跟 0、1 或 2 bs,然后是 c。
它在许多语言中都以这种方式工作,例如 Python。但是,在 R 中:
grepl("ab{,2}c", c("ac", "abc", "abbc", "abbbc", "abbbbc"))
# [1] TRUE TRUE TRUE TRUE FALSE
我对第四个TRUE 感到惊讶。在?regex,我可以阅读:
{n,m}前一项至少匹配n次,但不会更多 比m次。
所以我同意 {,2} 应该写成 {0,2} 是一个有效的模式(不像在 Python 中,文档明确指出省略 n 指定下限为零)。
但是使用{,2} 应该会抛出错误,而不是返回误导性匹配!我是否遗漏了什么,还是应该将其报告为错误?
【问题讨论】:
-
您使用了默认的 TRE 正则表达式引擎。如果您使用 PCRE 之一,您将得到所有项目的错误。始终指定下限以获得跨引擎的一致行为。
-
这太疯狂了!对我来说似乎是一个错误。
-
@Wiktor:我关心的是 TRE 引擎本身的一致性:当我要求它最多匹配 2
bs?