2013-08-23 10 views
5

Esiste un modo migliore per scrivere la seguente espressione regolare in Ruby? La prima espressione regolare corrisponde a una stringa che inizia con una consonante (in minuscolo), la seconda con una vocale.Utilizzo di Regexp per verificare se una stringa inizia con una consonante

Sto cercando di capire se esiste un modo per scrivere un'espressione regolare che corrisponda al negativo della seconda espressione, rispetto alla scrittura della prima espressione con diversi intervalli.

string =~ /\A[b-df-hj-np-tv-z]/ 
string =~ /\A[aeiou]/ 

risposta

11

La dichiarazione

$string =~ /\A[^aeiou]/ 

sarà verificare se la stringa inizia con un non-vocale carattere, che comprende cifre, punteggiatura, spazi e caratteri di controllo. Questo va bene se si conosce in anticipo che la stringa inizia con una lettera, ma per verificare che inizi con una consonante è possibile utilizzare forward look-ahead per verificare che inizi con una lettera e una non-vocale, come questa

$string =~ /\A(?=[^aeiou])(?=[a-z])/i 

per abbinare un numero arbitrario di consonanti, è possibile utilizzare il sub-espressione (?i:(?![aeiou])[a-z]) per abbinare una consonante. È atomico, quindi puoi inserire un numero di ripetizioni come {3} subito dopo. Per esempio, questo programma trova tutte le stringhe in un elenco che contengono tre consonanti di seguito

list = %w/ aab bybt xeix axei AAsE SAEE eAAs xxsa Xxsr/

puts list.select { |word| word =~ /\A(?i:(?![aeiou])[a-z]){3}/ } 

uscita

bybt 
xxsa 
Xxsr 
+0

Grazie, anche questo è molto utile! – evkline

+0

Come combineresti per più personaggi? Ad esempio, se volessi scoprire se le prime 3 lettere erano consonanti, con il {3} dopo l'espressione? – evkline

+1

@ EMK428: Le mie scuse - Sono caduto in Perl! Ho modificato la mia risposta per mostrare come abbinare utilizzare un conteggio di ripetizioni su una sotto-espressione "consonante". – Borodin

2

Se si desidera catturare una stringa che non inizia con le vocali , ma inizia solo con le consonanti, puoi usare questo codice qui sotto. Restituisce vero se una stringa inizia con qualsiasi lettera diversa da A, E, I, O, U. s è una stringa che diamo a una funzione

if /^[^aeiou\W]/i.match(s) == nil 
    return false 
    else 
    return true 
    end 

i aggiunto alla fine di rendere regolare espressione non sensibile al maiuscolo/minuscolo.

\ W viene utilizzato per catturare qualsiasi carattere non alfanumerico, per esempio se una stringa inizia con una cifra come: "1something"

[^ aeiou] intende un intervallo di carattere tranne aeiou

E mettiamo ^ all'inizio prima di [ per indicare che il seguente intervallo [^ aeiou \ W] se per il 1 ° carattere

2

Ho modificato la risposta fornita da @Alexander Cherednichenko al fine di eliminare le dichiarazioni if.

/^[^aeiou\W]/i.match(s) != nil 
Problemi correlati