является ли тире специальным символом в регулярном выражении R?

Несмотря на чтение справочной страницы регулярного выражения R

Наконец, чтобы включить литерал -, поместите его первым или последним (или, только для perl = TRUE, поставьте перед ним обратную косую черту).

не могу понять разницу между

grepl(pattern=paste("^thing1\\-",sep=""),x="thing1-thing2")

и

grepl(pattern=paste("^thing1-",sep=""),x="thing1-thing2")

Оба возвращают ИСТИНА. Мне бежать или нет? Какова наилучшая практика?


person RockScience    schedule 11.06.2014    source источник
comment
- является особенным в классах символов, где для сопоставления букв или - вам нужно будет написать [-a-zA-z], но я не думаю, что это вне их. В этом разделе страницы справки, похоже, конкретно обсуждаются классы персонажей.   -  person Marius    schedule 11.06.2014


Ответы (3)


Дефис чаще всего является обычным символом в регулярных выражениях.

Вам не нужно экранировать дефис за пределами класса символов; это не имеет особого значения.

В классе символов [ ] вы можете поместить дефис как первый или последний символ в диапазоне. Если вы поместите дефис где-нибудь еще, вам нужно экранировать его, чтобы добавить его в свой класс.

Примеры:

grepl('^thing1-', x='thing1-thing2')
[1] TRUE
grepl('[-a-z]+', 'foo-bar')
[1] TRUE
grepl('[a-z-]+', 'foo-bar')
[1] TRUE
grepl('[a-z\\-\\d]+', 'foo-bar')
[1] TRUE

Примечание. Чаще всего дефис ставится первым или последним в классе символов.

person hwnd    schedule 11.06.2014

Чтобы увидеть, что означает, что - имеет особое значение внутри класса символов (и как добавление его последним придает ему буквальное значение), попробуйте следующее:

grepl("[w-y]", "x")
# [1] TRUE
grepl("[w-y]", "-")
# [1] FALSE
grepl("[wy-]", "-")
# [1] TRUE
grepl("[wy-]", "x")
# [1] FALSE
person Josh O'Brien    schedule 11.06.2014

Они оба соответствуют одному и тому же тексту в этих случаях. То есть:

x <- "thing1-thing2"
regmatches(x,regexpr("^thing1\\-",x))
#[1] "thing1-"
regmatches(x,regexpr("^thing1-",x))
#[1] "thing1-"

Однако использование - является специальным символом в определенных ситуациях, для указания диапазонов значений, таких как символы между a и z, если они указаны внутри [], например:

regmatches(x,regexpr("[a-z]+",x))
#[1] "thing"
person thelatemail    schedule 11.06.2014