我正在测试使用交替进行回溯和匹配失败.
说我有以下正则表达式:
(foobar|barbaz)
我在以下字符串的向量上运行它.
x <- c('In context I have foobar and barbaz','In context I have foobaz and barbaz','In context I have fooquz and barbaz') regmatches(x,gregexpr('(foobar|barbaz)',x)) # [[1]] # [1] "foobar" "barbaz" # [[2]] # [1] "barbaz" # [[3]] # [1] "barbaz"
有没有办法让比赛完全失败,没有结果?
例如,在正则表达式(foobar | barbaz)中有一种方法可以使整个匹配完全失败,如果左侧表达式只匹配到foo,但如果foo之后没有b则失败?意味着右侧表达甚至不会被看到或匹配.
所以在这种情况下,第三个字符串会完全失败,因为在fooquz中foo之后没有b因此它不应该尝试右侧表达式而整个匹配将无法返回根本没有结果?
解决方法
如果您不熟悉(
PCRE
),那么在推进之前阅读文档将对您有所帮助.您可以使用perl = TRUE打开
PCRE
,并为此使用回溯动词.
> x <- c('foobar and barbaz','foobaz and barbaz','fooquz and barbaz') > regmatches(x,gregexpr('(foo(*COMMIT)b(*THEN)ar|barbaz)',x,perl=T)) ## [[1]] ## [1] "foobar" "barbaz" ## [[2]] ## [1] "barbaz" ## [[3]] ## character(0)
要清楚地看到第三个向量元素完全失败,请过滤结果.
> Filter(length,regmatches(x,perl=T))) ## [[1]] ## [1] "foobar" "barbaz" ## [[2]] ## [1] "barbaz"
说明:
>(* COMMIT)导致整体失败,没有起点前进.>(* THEN)导致在回溯到达时跳到下一个最里面的替代.>如果foo匹配但b失败,则回溯到(* COMMIT)会导致整个匹配失败.>如果foo和b匹配,但是ar失败,则回溯到(* THEN)会导致尝试下一个替代barbaz.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。