我想匹配"-"
的所有情况,但不匹配这些情况:
[\d]-[A-Z]
[A-Z]-[\d]
我尝试了以下模式:((?<![A-Z])-(?![0-9]))|((?<![0-9])-(?![A-Z]))
,但某些结果不正确,例如:“ RUA VF-32 N”
有人可以帮助我吗?
答案 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
详细信息
(?:\d-[A-Z]|[A-Z]-\d)
-一个非捕获组,它匹配数字-
和大写ASCII字母,或者大写ASCII字母-
和一个数字(*SKIP)(*F)
-忽略当前比赛,并在“失败”比赛结束时继续寻找下一个比赛|
-或-
-连字符。