2012-07-25 2 views
22

sto lavorando con rubino con il metodo match e voglio corrispondere a un URL che non contiene una certa stringa con un'espressione regolare: es:stringa Partita che non contiene una specifica parola

http://website1.com/url_with_some_words.html 
http://website2.com/url_with_some_other_words.html 
http://website3.com/url_with_the_word_dog.html 

voglio corrispondere gli URL che non contengono la parola dog, in modo che il 1 ° e il 2 ° quelli dovrebbe essere abbinato

+0

Questa domanda è meglio rispondere su posting [qui] (http://stackoverflow.com/questions/406230/regular-expression-to-match-string-not-contain-a-word) Cercare SO per domande simili è una buona idea. –

risposta

34

Basta usare un lookahead negativo ^(?!.*dog).*$.

Spiegazione

  • ^: abbinare inizio della linea
  • (?!.*dog): lookahead negativo, controllare se la parola cane non esiste
  • .*: abbinare tutto (tranne che a capo in questo caso)
  • $: corrispondenza di fine riga

Online demo

+0

Wow, questa informazione è stata sorprendentemente difficile da trovare. –

7

Basta usare

string !~ /dog/ 

per selezionare le stringhe necessarie.

2

In realtà c'è un modo incredibilmente semplice per farlo, utilizzando selezionare.

array_of_urls.select { |url| !url.match(/dog/) } 

questo restituirà un array di URL che non contengono la parola "cane" in qualsiasi punto.

+1

Più succintamente, 'array_of_urls.reject {| url | url.match (/ dog /)} " – nicholaides

+0

" incredibilmente semplice " – ahnbizcad

0

Un'altra cosa che si può utilizzare è:

!url['dog'] 

Con il vostro esempio:

array = [] 
array << 'http://website1.com/url_with_some_words.html' 
array << 'http://website2.com/url_with_some_other_words.html' 
array << 'http://website3.com/url_with_the_word_dog.html' 

array.select { |url| !url['dog'] } 

Si potrebbe anche respingere gli URL che fare contengono 'dog':

array.reject { |url| url['dog'] }