Подтвердить что ты не робот

Как я могу использовать специальные символы, такие как \^ $.? * | +() [{В моем регулярном выражении?

Я хочу сопоставить специальный символ регулярного выражения, \^$.?*|+()[{. Я пробовал:

x <- "a[b"
grepl("[", x)
## Error: invalid regular expression '[', reason 'Missing ']''

(Эквивалентно stringr::str_detect(x, "[") или stringi::stri_detect_regex(x, "[").)

Удвоение значения для выхода из него не работает:

grepl("[[", x)
## Error: invalid regular expression '[[', reason 'Missing ']''

Также не используется обратная косая черта:

grepl("\[", x)
## Error: '\[' is an unrecognized escape in character string starting ""\["

Как совместить специальные символы?


Некоторые особые случаи этого в старых, достаточно хорошо написанных вопросах, чтобы быть наглыми, чтобы закрыть их как дубликаты:
Экранированные периоды в регулярных выражениях R
Как избежать вопросительного знака в R?
экранирующий канал ( "" ") в регулярном выражении

4b9b3361

Ответ 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", "[")

Ответ 2

Я думаю, что самый простой способ сопоставить символы, например

\^$.?*|+()[

используют классы символов изнутри R. Рассмотрим, как очистить заголовки столбцов из файла данных, которые могут содержать пробелы и знаки пунктуации:

> library(stringr)
> colnames(order_table) <- str_replace_all(colnames(order_table),"[:punct:]|[:space:]","")

Этот подход позволяет нам вводить классы символов в соответствие с символами пунктуации, в дополнение к символам пробелов, что вам обычно нужно было бы избежать с помощью \\ для обнаружения. Подробнее о классах символов вы можете узнать ниже, и вы также можете ввести ?regexp, чтобы узнать больше об этом.

https://www.rstudio.com/wp-content/uploads/2016/09/RegExCheatsheet.pdf