2013-08-18 22 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"; 

Tôi đang cố gắng in tất cả các từ chứa 2 nguyên âm lân cận trong một chuỗi nhất định.
o/p: phải được "khen ngợi" và "tốt".Làm thế nào để trích xuất các từ thông qua khớp mẫu?

Tôi đã thử với điểm dừng phủ định [^] để tách và chỉ cung cấp 2 nguyên âm lân cận.

+0

Làm liền kề nguyên âm cần phải được tăng gấp đôi "aa", "ee", "oo". Hoặc chúng ta cũng có thể có "ea", "ou" vv? –

+0

Nó có thể là bất kỳ sự kết hợp nào nhưng bên cạnh phải là nguyên âm – Angus

+1

OK, cảm ơn bạn đã làm rõ, tôi đã điều chỉnh câu trả lời của mình. Bạn có thể muốn cung cấp nhiều dữ liệu ví dụ hơn trong OP, vì nó chỉ có nguyên âm kép và nỗ lực đầu tiên của bạn ở regex trông giống như bạn đang cố gắng tăng gấp đôi. –

Trả lời

10

Chức năng Perl split không phù hợp để tìm danh sách kết quả phù hợp. Thay vào đó, tôi khuyên bạn nên sử dụng công cụ sửa đổi regex g. while, hoặc bạn có thể gán danh sách kết quả trong một đi

Ví dụ sau phải phù hợp với tất cả các từ trong một chuỗi có chứa hai nguyên âm liền kề:.

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

Output:

praveen 
good 

Bạn cũng có thể làm điều này:

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

và xử lý kết quả tương tự như cách bạn đã chế biến @try trong OP.

+1

Tốt hơn '\ w *', không? Nếu không nó sẽ không hoạt động như mong đợi với các ví dụ tương tự như: 'aaron là một cậu bé tốt' – Birei

+1

Điều này không xử lý các trường hợp từ cuối cùng đã tăng gấp đôi nguyên âm. Bạn có thể làm '$ string = ~/(\ w + ([aeiou]) {2} (?: \ W + | \ b))/g' mà sau đó làm việc với" "praveen là một cậu bé ngoan, hoot, hoo." ' – JRFerguson

+0

Cảm ơn các cải tiến được đề xuất. Tôi không hoàn toàn chắc chắn nếu các nguyên âm phù hợp là chính xác nào được nêu ra, một trong hai. "Hai nguyên âm liền kề" là từ ngữ của OP, nhưng "nguyên âm kép" có vẻ giống như mục tiêu từ regex gốc. –

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"; 
    }; 
}; 

Lý do đầu tiên là "phân tách" là dấu tách. Chia tách (-8

+0

Các lớp nhân vật bên trong bạn không phải tách riêng từng lớp. Và theo cách đó nó có thể cho kết quả xấu, như: 'ca ngợi, n'. – Birei

+0

Sai lầm của tôi, tôi chỉ vô tình sao chép nó. Đã chỉnh sửa. – darken

6

Bạn có thể làm một cái gì đó giống như ..

#!/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"; 
} 

biểu hiện thường xuyên:

(    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 

Đó là cơ bản giống như làm /(\w*([aeiou])[aeiou]+(?:\w*))/

Output:

praveen 
good 
aaron 
good 
praveen 
aaron 
good 
hoot 
+0

Điều này thực sự trích xuất các từ gồm 4 chữ cái chứa nguyên âm ở đâu đó ở giữa (ký tự 1 đến n-2 trong đó n là độ dài của từ). . . thử "voi màu tím" –

+0

Hãy thử regex của bạn với "voi màu tím" và sau đó là của tôi. . . có sự khác biệt. Thật không may tất cả các câu mẫu có 4 chữ cái cho tất cả các từ phù hợp. Vì vậy, thay đổi "ho" thành "hoo" và các biến thể khác.Lưu ý regex của tôi không đúng để bắt đầu một trong hai, và nó cần một ai đó để chỉ nó ra cho tôi. –

+0

Đã sửa lỗi. Cảm ơn. – hwnd

Các vấn đề liên quan