Втеча з подвійною косою рискою
R розглядає зворотні скісні риски як вихідні значення для констант символів . (... так само як і регулярні вирази. Звідси необхідність двох зворотних скісних рисок під час подання аргументу символу для шаблону. Перший насправді не є символом, а навпаки, робить другий символом.) Ви можете бачити як вони обробляються за допомогою cat
.
y <- "double quote: \", tab: \t, newline: \n, unicode point: \u20AC"
print(y)
cat(y)
Подальше читання: Уникнення зворотної скісної риски зі зворотною рискою рискою у R дає 2 зворотні скісні риски в рядку, а не 1
Щоб використовувати спеціальні символи в регулярному виразі, найпростіший спосіб - це, як правило, уникнути їх зворотною рискою рискою, але, як зазначалося вище, саму зворотну скісну риску потрібно уникнути.
grepl("\\[", "a[b")
Для відповідності зворотних скісних рисок потрібно подвоїти втечу, в результаті чого з’явиться чотири зворотні скісні риски.
grepl("\\\\", c("a\\b", "a\nb"))
rebus
Пакет містить константи для кожного зі спеціальних символів , щоб врятувати вас помилки косою рисою.
library(rebus)
OPEN_BRACKET
BACKSLASH
Більше прикладів:
?SpecialCharacters
Вашу проблему можна вирішити таким чином:
library(rebus)
grepl(OPEN_BRACKET, "a[b")
Сформуйте клас персонажа
Ви також можете обернути спеціальні символи в квадратні дужки, щоб сформувати клас символів .
grepl("[?]", "a?b")
Два спеціальні символи мають особливе значення всередині класів символів: \
і ^
.
Зворотну косу риску все одно потрібно уникати, навіть якщо вона знаходиться всередині класу символів.
grepl("[\\\\]", c("a\\b", "a\nb"))
Карет потрібно уникати, лише якщо це безпосередньо після квадратної дужки, що відкривається.
grepl("[ ^]", "a^b")
grepl("[\\^]", "a^b")
rebus
також дозволяє сформувати клас символів.
char_class("?")
Використовуйте вже існуючий клас символів
Якщо ви хочете зрівняти всі розділові знаки, ви можете використовувати [:punct:]
клас символів.
grepl("[[:punct:]]", c("//", "[", "(", "{", "?", "^", "$"))
stringi
відображає це в розділі Unicode General Category для пунктуації, тому його поведінка дещо відрізняється.
stri_detect_regex(c("//", "[", "(", "{", "?", "^", "$"), "[[:punct:]]")
Ви також можете використовувати синтаксис між платформами для доступу до UGC.
stri_detect_regex(c("//", "[", "(", "{", "?", "^", "$"), "\\p{P}")
Використовуйте клавіші \ Q \ E
Розміщення символів між \\Q
і \\E
робить механізм регулярних виразів трактувати їх буквально, а не як регулярні вирази.
grepl("\\Q.\\E", "a.b")
rebus
дозволяє писати буквальні блоки регулярних виразів.
literal(".")
Не використовуйте регулярні вирази
Регулярні вирази не завжди є відповіддю. Якщо ви хочете зіставити фіксований рядок, ви можете зробити це, наприклад:
grepl("[", "a[b", fixed = TRUE)
stringr::str_detect("a[b", fixed("["))
stringi::stri_detect_fixed("a[b", "[")
cat
щоб побачити ефект втечі за допомогою зворотних скісних рисок, висвітлює.