Ответ 1
Побег с двойной обратной косой чертой
R обрабатывает обратную косую черту как escape-значения для символьных констант. (... и, следовательно, регулярные выражения. Следовательно, необходимо наличие двух обратных косых черт при поставке символьного аргумента для шаблона. Первый - это не символ, а второй - символ). Вы можете видеть как они обрабатываются с помощью cat
.
y <- "double quote: \", tab: \t, newline: \n, unicode point: \u20AC"
print(y)
## [1] "double quote: \", tab: \t, newline: \n, unicode point: €"
cat(y)
## double quote: ", tab: , newline:
## , unicode point: €
Дальнейшее чтение: Сброс обратной косой черты с обратным слэшем в R вызывает 2 обратных слэша в строке, а не 1
Чтобы использовать специальные символы в регулярном выражении, простейший метод обычно заключается в том, чтобы избежать их с помощью обратного слэша, но, как отмечено выше, обратная косая черта должна быть экранирована.
grepl("\\[", "a[b")
## [1] TRUE
Чтобы совместить обратную косую черту, вам нужно удвоить бегство, в результате чего получится четыре обратных слэша.
grepl("\\\\", c("a\\b", "a\nb"))
## [1] TRUE FALSE
Пакет rebus
содержит константы для каждого из специальных символов, чтобы сэкономить на ошибках.
library(rebus)
OPEN_BRACKET
## [1] "\\["
BACKSLASH
## [1] "\\\\"
Дополнительные примеры:
?SpecialCharacters
Ваша проблема может быть решена следующим образом:
library(rebus)
grepl(OPEN_BRACKET, "a[b")
Формировать класс символов
Вы можете также обернуть специальные символы в квадратных скобках, чтобы сформировать класс символов.
grepl("[?]", "a?b")
## [1] TRUE
Два специальных символа имеют особое значение внутри классов символов: \
и ^
.
Обратный слэш по-прежнему должен быть экранирован, даже если он находится внутри класса символов.
grepl("[\\\\]", c("a\\b", "a\nb"))
## [1] TRUE FALSE
Уход должен только ускользнуть, если он находится непосредственно после квадратного скобки открытия.
grepl("[ ^]", "a^b") # matches spaces as well.
## [1] TRUE
grepl("[\\^]", "a^b")
## [1] TRUE
rebus
также позволяет сформировать класс символов.
char_class("?")
## <regex> [?]
Использовать существующий класс символов
Если вы хотите совместить все знаки препинания, вы можете использовать класс символов [:punct:]
.
grepl("[[:punct:]]", c("//", "[", "(", "{", "?", "^", "$"))
## [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE
stringi
отображает это в общую категорию Unicode для пунктуации, поэтому его поведение немного отличается.
stri_detect_regex(c("//", "[", "(", "{", "?", "^", "$"), "[[:punct:]]")
## [1] TRUE TRUE TRUE TRUE TRUE FALSE FALSE
Вы также можете использовать кросс-платформенный синтаксис для доступа к UGC.
stri_detect_regex(c("//", "[", "(", "{", "?", "^", "$"), "\\p{P}")
## [1] TRUE TRUE TRUE TRUE TRUE FALSE FALSE
Использование \Q\E экранов
Размещение символов между \\Q
и \\E
делает механизм регулярных выражений обрабатывать их буквально, а не как регулярные выражения.
grepl("\\Q.\\E", "a.b")
## [1] TRUE
rebus
позволяет писать литеральные блоки регулярных выражений.
literal(".")
## <regex> \Q.\E
Не используйте регулярные выражения
Регулярные выражения не всегда являются ответом. Если вы хотите сопоставить фиксированную строку, вы можете сделать это, например:
grepl("[", "a[b", fixed = TRUE)
stringr::str_detect("a[b", fixed("["))
stringi::stri_detect_fixed("a[b", "[")