R-регулярное выражение: сопоставление строк, не начинающихся с шаблона - PullRequest
15 голосов
/ 09 декабря 2011

Я хотел бы использовать регулярное выражение, чтобы увидеть, не начинается ли строка с определенного шаблона.Хотя я могу использовать: [^ для внесения в черный список определенных символов, я не могу понять, как занести в черный список шаблон.

> grepl("^[^abc].+$", "foo")
[1] TRUE
> grepl("^[^abc].+$", "afoo")
[1] FALSE

Я хотел бы сделать что-то вроде grepl("^[^(abc)].+$", "afoo") и получить TRUEто есть, чтобы соответствовать, если строка не начинается с abc sequence.

Обратите внимание, что я знаю этот пост , и я также пытался использовать perl = TRUE, но безуспех:

> grepl("^((?!hede).)*$", "hede", perl = TRUE)
[1] FALSE
> grepl("^((?!hede).)*$", "foohede", perl = TRUE)
[1] FALSE

Есть идеи?

Ответы [ 2 ]

24 голосов
/ 09 декабря 2011

Да. Положите заглядывание нулевой ширины / наружу / другие паренсы. Это должно дать вам это:

> grepl("^(?!hede).*$", "hede", perl = TRUE)
[1] FALSE
> grepl("^(?!hede).*$", "foohede", perl = TRUE)
[1] TRUE

что я думаю, что вы хотите.

Альтернативно, если вы хотите захватить всю строку, ^(?!hede)(.*)$ и ^((?!hede).*)$ являются эквивалентными и приемлемыми.

2 голосов
/ 09 апреля 2016

Я застрял в следующем особом случае, поэтому подумал, что поделюсь ...

Что если есть несколько экземпляров регулярного выражения, но вам все еще нужен только первый сегмент?

Видимо можно отключить неявную жадность поиска с конкретными модификаторами подстановочных знаков perl

Предположим, что строка, которую я хотел обработать, была

myExampleString = paste0(c(letters[1:13], "_", letters[14:26], "__",
                           LETTERS[1:13], "_", LETTERS[14:26], "__",
                           "laksjdl", "_", "lakdjlfalsjdf"),
                         collapse = "")
myExampleString

"abcdefghijklm_nopqrstuvwxyz__ABCDEFGHIJKLM_NOPQRSTUVWXYZ__laksjdl_lakdjlfalsjd"

и что я хотел только первый сегмент перед первым "__". Я не могу просто искать на "_", потому что одно подчеркивание допустимый без разделителя в этом примере строки.

Следующее не работает. Вместо этого он дает мне первые и вторые сегменты из-за жадности по умолчанию (но не третий, из-за прогнозирования).

gsub("^(.+(?=__)).*$", "\\1", myExampleString, perl = TRUE)

"abcdefghijklm_nopqrstuvwxyz__ABCDEFGHIJKLM_NOPQRSTUVWXYZ"

Но это работает

gsub("^(.+?(?=__)).*$", "\\1", myExampleString, perl = TRUE)

"abcdefghijklm_nopqrstuvwxyz"

Разница заключается в жадном модификаторе "?" после подстановочного знака ".+" в регулярном выражении (perl).

...