Я застрял в следующем особом случае, поэтому подумал, что поделюсь ...
Что если есть несколько экземпляров регулярного выражения, но вам все еще нужен только первый сегмент?
Видимо можно отключить неявную жадность поиска
с конкретными модификаторами подстановочных знаков 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).