2013-08-18 26 views
5
#!/usr/bin/perl 

use strict; 
use warnings; 
my $string = "praveen is a good boy"; 
my @try = split(/([a,e,i,o,u]).*\1/,$string); 
print "@try\n"; 

Próbuję wydrukować wszystkie słowa zawierające 2 sąsiednie samogłoski w danym ciągu.
o/p: musi być "praveen" i "good".Jak wyodrębnić słowa za pomocą dopasowywania wzorców?

Próbowałem z negate exp [^], aby podzielić i dać tylko 2 sąsiednie samogłoski.

+0

Wykonaj sąsiadujące samogłoski muszą być podwójne "aa", "ee", "oo". Czy możemy też mieć "ea", "ou" itp.? –

+0

Może to być dowolna kombinacja, ale sąsiedni musi być samogłoską – Angus

+1

OK, dziękuję za wyjaśnienia, poprawiłem odpowiedź. Możesz chcieć podać więcej przykładowych danych w OP, ponieważ ma on tylko podwójne samogłoski, a twoja pierwsza próba regex wygląda tak, jakbyś również próbowała użyć debla. –

Odpowiedz

10

Funkcja Perl split nie pasuje dobrze do znalezienia listy dopasowań, zamiast tego polecam użycie modyfikatora regex g. Aby przetworzyć wszystkie dopasowania, można albo zapętlić, używając np. while, czy można przypisać listę meczów w jednym zamachem

Poniższy przykład powinien pasować do wszystkich słów w ciągu znaków, które zawierają dwa sąsiadujące samogłoski.

my $string = "praveen is a good boy"; 
while ($string =~ /(\w*[aeiou]{2}\w*)/g) { 
    print "$1\n" 
} 

wyjściowa:

praveen 
good 

Można też to zrobić:

my @matches = ($string =~ /\w*[aeiou]{2}\w*/g); 

i przetwarzać wynik podobny do tego, jak zostałeś przetwarzanie @try w PO.

+1

Lepsze '\ w *', nie? W przeciwnym razie nie działałby zgodnie z oczekiwaniami z przykładami podobnymi do: 'aaron jest dobrym chłopcem' – Birei

+1

To nie obsługuje przypadków, w których ostatnie słowo ma podwójne samogłoski. Możesz zrobić "$ string = ~/(\ w + ([aeiou]) {2} (?: \ W + | \ b))/g", który następnie działa z '" praveen jest dobrym chłopcem, pohukiem, hoo. " ' – JRFerguson

+0

Dzięki za sugerowane usprawnienia. Nie jestem do końca pewien, czy dopasowanie samogłosek jest poprawne. "Dwie sąsiednie samogłoski" to słowa OP, ale "podwójne samogłoski" wydają się być celem z oryginalnego wyrażenia regularnego. –

3
#!/usr/bin/perl 

use strict; 
use warnings; 
my $string = "praveen is a good boy"; 
my @try = split(/\s/,$string); 
for(@try) { 
# if(/[a,e,i,o,u]{2}/) { 
    if(/[aeiou]{2}/) { # edited after Birei's comment 
     print "$_\n"; 
    }; 
}; 

Pierwszy argument "podziału" jest ogranicznikiem. Podział splitów (-8

+0

Wewnątrz klas postaci nie musisz rozdzielać każdego. W ten sposób może dać złe wyniki, takie jak: "prave, n'. – Birei

+0

Mój błąd, po prostu bezmyślnie go skopiowałem. Edytowane. – darken

6

Można zrobić coś takiego ..

#!/usr/bin/perl 

use strict; 
use warnings; 

my $str 
    = "praveen is a good boy\n" 
    . "aaron is a good boy\n" 
    . "praveen and aaron are good, hoot, ho" 
    ; 

while ($str =~ /(\w*([aeiou])\2(?:\w*))/g) { 
     print $1, "\n"; 
} 

Wyrażenie regularne:

(    group and capture to \1: 
\w*   word characters (a-z, A-Z, 0-9, _) (0 or more times) 
    (   group and capture to \2: 
    [aeiou]  any character of: 'a', 'e', 'i', 'o', 'u' 
    )   end of \2 
    \2   what was matched by capture \2 
    (?:   group, but do not capture: 
     \w*  word characters (a-z, A-Z, 0-9, _) (0 or more times) 
    )   end of grouping 
)    end of \1 

który jest w zasadzie taka sama jak robi /(\w*([aeiou])[aeiou]+(?:\w*))/

wyjściowa:

praveen 
good 
aaron 
good 
praveen 
aaron 
good 
hoot 
+0

To jest faktycznie wyodrębnianie słów z 4+ liter, które zawierają samogłoskę gdzieś w środku (znak 1 do n-2, gdzie n to długość słowa). . . spróbuj "słonie są fioletowe" –

+0

Spróbuj swoich wyrażeń regularnych "słonie są fioletowe", a następnie moje. . . jest różnica. Niestety wszystkie przykładowe zdania mają 4+ litery dla wszystkich pasujących słów. Zmień "ho" na "hoo" i inne warianty.Zauważ, że moje regex też nie miało racji, i potrzebowałem kogoś, kto by mi to wskazał. –

+0

Naprawiono. Dzięki. – hwnd

Powiązane problemy