我试图检测某个字符串的所有出现,该字符串没有被某些字符串包围(使用regex查找(。例如,所有出现的"非洲"而不是"南非社会"。请参阅下面的简化示例。
#My example text:
text <- c("South African Society", "South African",
"African Society", "South African Society and African Society")
#My code examples:
str_detect(text, "(?<!South )African(?! Society)")
#or
grepl("(?<!South )African(?! Society)", perl=TRUE , text)
#I need:
[1] FALSE TRUE TRUE TRUE
#instead of:
[1] FALSE FALSE FALSE FALSE
问题似乎是regex分别评估lookbehind和lookahead,而不是作为一个整体。它应该需要两个条件,而不仅仅是一个条件。
(?<!South )African(?! Society)
模式在前面既没有South
也没有Society
时与African
匹配。如果存在South
或Society
,则将不存在匹配。
有几种解决方案。
African(?<!South African(?= Society))
请参阅regex演示。这里,只有当正则表达式引擎在匹配紧接着空格和Society
的African
子串之后的位置没有找到South African
时,才匹配African
。在出现与模式不匹配的较长字符串的情况下,在African
之后使用此检查比在单词African
之前移动它更有效(请参阅(?<!South (?=African Society))African
regex演示(。
或者,您可以使用SKIP-FAIL技术:
South African Society(*SKIP)(*F)|African
请参阅另一个regex演示。这里,首先匹配South African Society
,而(*SKIP)(*F)
使该匹配失败并进行下一个匹配,因此African
在除South African Society
之外的所有上下文中都匹配。