2013-08-23 14 views
5

Czy istnieje lepszy sposób napisania następującego wyrażenia regularnego w Ruby? Pierwsze wyrażenie regularne pasuje do łańcucha zaczynającego się od spółgłoski (małe litery), a drugiego do samogłoski.Używanie Regexp do sprawdzania, czy ciąg zaczyna się od spółgłoski

Próbuję dowiedzieć się, czy istnieje sposób na napisanie wyrażenia regularnego, które pasuje do negatywu drugiego wyrażenia, w porównaniu do napisania pierwszego wyrażenia z kilkoma zakresami.

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

Odpowiedz

11

Oświadczenie

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

będzie sprawdzić, czy ciąg rozpoczyna się bez samogłosek charakteru, który zawiera cyfry, znaki interpunkcyjne, spacje i znaki sterujące. To jest w porządku, jeśli wcześniej wiesz, że ciąg zaczyna się od litery, ale aby sprawdzić, czy zaczyna się od spółgłoski, możesz użyć do przodu, aby sprawdzić, czy zaczyna się od litery i nie-samogłoski, jak to

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

aby dopasować dowolną liczbę spółgłosek, można użyć sub-wyrażenie (?i:(?![aeiou])[a-z]) dopasować spółgłoskę. Jest atomowy, więc możesz umieścić liczbę powtórzeń tak jak {3} zaraz po nim. Na przykład, program znajdzie wszystkie sznurki na liście, które zawierają trzy spółgłoski w rzędzie

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

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

wyjście

bybt 
xxsa 
Xxsr 
+0

Dziękuję, jest to również bardzo pomocne! – evkline

+0

Jak pasowałbyś do wielu postaci? Na przykład, jeśli chcesz sprawdzić, czy pierwsze trzy litery były spółgłoskami, z {3} po wyrażeniu? – evkline

+1

@ EMK428: Moje przeprosiny - pogrążyłem się w Perlu! Zmodyfikowałem swoją odpowiedź, aby pokazać, w jaki sposób dopasować, używając liczby powtórzeń w podekspansie "spółgłoskowym". – Borodin

2

Jeśli chcesz złapać ciąg, który nie rozpoczyna się od samogłoski , ale zaczyna się tylko od spółgłosek, możesz użyć tego kodu poniżej. Zwraca true, jeśli ciąg rozpoczyna się od jakiegokolwiek innego niż litery A, E, I, O, U. s jest dowolny ciąg dajemy do funkcji

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

i dodany na końcu, aby regularnie wielkość liter nie ma znaczenia.

\ W służy do połowu wszelkich charakter non-słowo, na przykład jeśli ciąg rozpoczyna się od cyfry, takich jak: "1something"

[^ aeiou] oznacza zakres charakter wyjątkiem aeiou

I stawiamy ^ na początku przed [, aby wskazać, że następujący zakres [^ aeiou \ w] jeśli za 1 znak

2

Zmodyfikowalem odpowiedź udzieloną przez @Alexandra Cherednichenko, aby pozbyć się instrukcji if.

/^[^aeiou\W]/i.match(s) != nil 
Powiązane problemy