Регулярное выражение (regex lookarounds) для обнаружения определенной строки не между определенными строками (lookahead & lookbehind, слово не окружено словами)

Я пытаюсь обнаружить все вхождения определенной строки, которая не окружена определенными строками (с использованием регулярных выражений). Например. все случаи "африканского", но не "южноафриканского общества". Смотрите упрощенный пример ниже.

#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

Кажется, проблема в том, что регулярное выражение оценивает взгляд назад и взгляд вперед отдельно, а не в целом. Это должно требовать обоих условий, а не только одного.

1 ответ

Решение

(?<!South )African(?! Society) сопоставления с образцом African когда ему не предшествует ни South ни Society, Если там есть South или же Society не будет никакого совпадения.

Есть несколько решений.

 African(?<!South African(?= Society))

Смотрите демо-версию регулярного выражения. Вот, African сопоставляется только тогда, когда двигатель регулярных выражений не находит South African на позиции после сопоставления African подстрока, за которой сразу следует пробел и Society, Используя эту проверку после African более эффективен, если есть более длинные строки, которые не соответствуют шаблону, чем перемещать его перед словом African (см. (?<!South (?=African Society))African regex demo).

Кроме того, вы можете использовать технику SKIP-FAIL:

South African Society(*SKIP)(*F)|African

Смотрите другую демонстрацию регулярных выражений. Вот, South African Society сопоставляется первым, и (*SKIP)(*F) делает этот матч неудачным и переходит к следующему матчу, поэтому African сопоставляется во всех контекстах, кроме South African Society,

Другие вопросы по тегам