2014-06-11 6 views
10

Nonostante la lettura del help page of R regexè un trattino un carattere speciale in R regex?

Infine, per includere un letterale -, posizionarlo prima o l'ultima (o, per perl = TRUE solo, lo precedono da una barra rovesciata).

non riesco a capire la differenza tra

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

e

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

Entrambi restituiscono TRUE. Dovrei fuggire o non qui? Qual è la migliore pratica?

+4

'-' è speciale all'interno delle classi di caratteri, dove abbinare lettere o' -' dovresti scrivere '[-a-zA-z]' ma non penso che sia al di fuori di esse. Quella sezione della pagina di aiuto sembra discutere specificamente delle classi di caratteri. – Marius

risposta

10

Il trattino è in genere un normale carattere nelle espressioni regolari.

Non è necessario sfuggire al trattino al di fuori di una classe di caratteri; non ha un significato speciale.

All'interno di una classe di caratteri [ ] è possibile inserire un trattino come prima o ultima carattere nell'intervallo. Se si posiziona il trattino in qualsiasi altro punto, è necessario sfuggirlo per aggiungerlo alla classe.

Esempi:

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 

Nota: È più comune trovare un trattino posto primo o ultima all'interno di una classe di caratteri.

+0

molto chiaro, grazie – RockScience

1

Entrambi corrispondono allo stesso testo in queste istanze. Per esempio:

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

Utilizzando una - è un carattere speciale in determinate situazioni, però, per specificare intervalli di valori, ad esempio caratteri tra a e z quando specifed all'interno [], ad esempio:

regmatches(x,regexpr("[a-z]+",x)) 
#[1] "thing" 
6

Per vedere cosa significa per - avere un significato speciale all'interno di una classe di caratteri (e come metterlo per ultimo dà il suo significato letterale), prova quanto segue:

grepl("[w-y]", "x") 
# [1] TRUE 
grepl("[w-y]", "-") 
# [1] FALSE 
grepl("[wy-]", "-") 
# [1] TRUE 
grepl("[wy-]", "x") 
# [1] FALSE 
+0

capito, grazie! – RockScience