正则表达式匹配模式,但不匹配两种特定情况

时间:2018-07-27 20:12:09

标签: r regex regex-lookarounds

我想匹配"-"的所有情况,但不匹配这些情况:

  1. [\d]-[A-Z]
  2. [A-Z]-[\d]

我尝试了以下模式:((?<![A-Z])-(?![0-9]))|((?<![0-9])-(?![A-Z])),但某些结果不正确,例如:“ RUA VF-32 N”

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

一种简单的方法是在当前逻辑中使用grep并反转结果,然后运行另一个grep以仅保留其中带有连字符的项目:

x <- c("QUADRA 120 - ASA BRANCA","FAZENDA LAGE -RODOVIA RIO VERDE","C-15","99-B","A-A")
grep("-", grep("[A-Z]-\\d|\\d-[A-Z]", x, invert=TRUE, value=TRUE), value=TRUE, fixed=TRUE)
# => [1] "QUADRA 120 - ASA BRANCA"         "FAZENDA LAGE -RODOVIA RIO VERDE"
#    [3] "A-A"   

此处,[A-Z]-\\d|\\d-[A-Z]在大写ASCII字母或数字之间或数字和ASCII大写字母之间匹配连字符。如果存在匹配项,则由于invert=TRUE导致结果取反。

请参见R demo

要仅在除字母和数字之间的所有上下文中匹配-,可以使用基于SKIP-FAIL technique的PCRE正则表达式,例如

> grep("(?:\\d-[A-Z]|[A-Z]-\\d)(*SKIP)(*F)|-", x, perl=TRUE)
[1] 1 2

请参见this regex demo

详细信息

  • (?:\d-[A-Z]|[A-Z]-\d)-一个非捕获组,它匹配数字-和大写ASCII字母,或者大写ASCII字母-和一个数字
  • (*SKIP)(*F)-忽略当前比赛,并在“失败”比赛结束时继续寻找下一个比赛
  • |-或
  • --连字符。
相关问题