2012-07-09 34 views
21

Tôi có một regex mà phù hợp với một số văn bản như:Biểu thức chính quy Perl - Công cụ sửa đổi gc có nghĩa là gì?

$text =~ m/$regex/gcxs 

Bây giờ tôi muốn biết những gì 'gc' modifier có nghĩa là:

Tôi đã tìm kiếm và phát hiện ra rằng gc nghĩa "Allow tiếp tục tìm kiếm sau khi kết quả không thành công/g ".

Điều này không rõ ràng đối với tôi. Tiếp tục tìm kiếm nghĩa là gì?

Theo như tôi đã hiểu, điều đó có nghĩa là bắt đầu khớp lúc đầu nếu tìm kiếm /g không thành công. Nhưng không /g công cụ sửa đổi phù hợp với toàn bộ chuỗi?

Trả lời

32

Công cụ sửa đổi /g được sử dụng để ghi nhớ "vị trí trong chuỗi" để bạn có thể xử lý từng chuỗi một. ví dụ.

my $txt = "abc3de"; 
while($txt =~ /\G[a-z]/g) 
{ 
    print "$&"; 
} 
while($txt =~ /\G./g) 
{ 
    print "$&"; 
} 

Bởi vì vị trí là đặt lại trên một trận đấu thất bại, ý chí sản lượng trên

abcabc3de 

Cờ /c không thiết lập lại các vị trí trên một trận đấu thất bại. Vì vậy, nếu chúng ta thêm /c để regex đầu tiên như vậy

my $txt = "abc3de"; 
while($txt =~ /\G[a-z]/gc) 
{ 
    print "$&"; 
} 
while($txt =~ /\G./g) 
{ 
    print "$&"; 
} 

Chúng tôi kết thúc với mã

abc3de 

mẫu: http://ideone.com/cC9wb

+1

nhờ cho đẹp giải thích – AnonGeek

+0

Câu trả lời này đã được thêm vào [Stack Overflow Regular Expression FAQ] (http://stackoverflow.com/a/22944075/2736496), dưới "Modifiers ". – aliteralmind

3

Trong perldoc perlre http://perldoc.perl.org/perlre.html#Modifiers

khớp toàn cầu và giữ vị trí hiện tại sau khi kết hợp không thành công. Không giống như i, m, s và x, hai cờ này ảnh hưởng đến cách regex được sử dụng thay vì chính regex. Xem Sử dụng cụm từ thông dụng trong Perl trong perlretut để giải thích thêm về các biến tố g và c.

Tỉ quy định dẫn đến:

http://perldoc.perl.org/perlretut.html#Using-regular-expressions-in-Perl

URI này có một tiểu phần có tiêu đề, 'kết hợp toàn cầu', trong đó có một hướng dẫn nhỏ/example làm việc, bao gồm:

Một trận đấu không thành công hoặc thay đổi chuỗi mục tiêu đặt lại vị trí. Nếu bạn không muốn đặt lại vị trí sau khi không khớp, hãy thêm // c, as in/regexp/gc. Vị trí hiện tại trong chuỗi được liên kết với chuỗi, không phải là regexp. Điều này có nghĩa là các chuỗi khác nhau có các vị trí khác nhau và vị trí tương ứng của chúng có thể được thiết lập hoặc đọc độc lập.

HTH Lee

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