2009-03-13 29 views
33

Một người bạn đã hỏi tôi điều này và tôi đã bối rối: Có cách nào để tạo biểu thức chính quy khớp với chuỗi của cùng một nhân vật không? Ví dụ: khớp với 'aaa', 'bbb', nhưng không khớp với 'abc'?Regex nào có thể khớp các chuỗi của cùng một ký tự?

m|\w{2,3}| 

Sẽ không thực hiện thủ thuật vì nó khớp với 'abc'.

m|a{2,3}| 

không có làm các trick vì nó sẽ không phù hợp 'bbb', 'ccc', vv

Trả lời

64

chắc Điều! Nhóm và tham chiếu là bạn của bạn:

(.)\1+ 

Sẽ khớp với 2 hoặc nhiều lần xuất hiện cùng một ký tự. Đối với chữ ký tự thành phần duy nhất, sử dụng \w thay vì ., tức là .:

(\w)\1+ 
+0

Điều này sẽ chỉ khớp với một số ký tự và bỏ lỡ các ký tự như '###'. Các ví dụ ông đã đưa ra nơi chars chữ cái, nhưng nó không thực sự yêu cầu chỉ những chữ cái. Tôi sẽ thay thế '\ w' bằng '.'. – gpojd

+0

Vâng, dựa trên các ví dụ không hoạt động mà người hỏi đưa ra, tôi cho rằng anh ta chỉ muốn khớp các ký tự chữ cái. Tôi nên thể hiện điều này trong phần giải thích. –

+0

Dấu gạch chéo 1 có nghĩa là gì? – CodyBugstein

0

Trả lời câu hỏi của riêng tôi, nhưng đã nhận nó:

m|(\w)\1+| 
+0

\ W đối diện với những gì bạn muốn, phải không? – Telemachus

+0

Telemachus đúng, điều này sẽ không khớp với các ví dụ bạn đưa ra trong câu hỏi. – gpojd

+0

Cũng tốt hơn là không sử dụng các đường ống (hoặc bất kỳ dấu phân cách không mặc định nào khác) cho cụm từ thông dụng trừ khi bạn có lý do. – Pat

1

Đây là những gì backreferences là dành cho.

m/(\w)\1\1/ 

sẽ thực hiện thủ thuật.

+1

Điều này sẽ không khớp với 'aa'. – gpojd

3

này sẽ phù hợp hơn \ w sẽ, như @@@:

/(.)\1+/ 
+0

Đây là một trong những quyền, cho "một chuỗi của cùng một nhân vật", và không chỉ là "aaa", "bbb" ví dụ. +1 – Axeman

+0

Sự khác biệt giữa nhúng biểu thức trong dấu gạch chéo là "/" và không sử dụng chúng là gì? – skan

10

Lưu ý rằng trong Perl 5.10 chúng tôi có ký hiệu thay thế cho backreferences là tốt.

foreach (qw(aaa bbb abc)) { 
    say; 
    say ' original' if /(\w)\1+/; 
    say ' new way' if /(\w)\g{1}+/; 
    say ' relative' if /(\w)\g{-1}+/; 
    say ' named' if /(?'char'\w)\g{char}+/; 
    say ' named' if /(?<char>\w)\k<char>+/; 
} 
+0

http://perldoc.perl.org/perlre.html hoặc http://perldoc.perl.org/search.html?q=perlre –

1

này cũng có thể sử dụng biểu thức thông thường tinh khiết (tức là những mô tả thường xuyên ngôn ngữ - không Perl regexps). Thật không may, nó có nghĩa là một regexp có chiều dài là tỷ lệ thuận với kích thước của bảng chữ cái, ví dụ .:

(a* + b* + ... + z*) 

Trong trường hợp ... z là những biểu tượng trong bảng chữ cái hữu hạn.

Vì vậy, Perl regexps, mặc dù có một phần lớn các biểu thức chính quy thuần túy, chắc chắn có lợi thế ngay cả khi bạn chỉ muốn sử dụng chúng cho các biểu thức chính quy thuần túy!

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