2013-01-10 39 views
5

Tôi hy vọng câu hỏi của tôi chưa được đặt ra bởi người khác, vì tôi đã cố gắng tìm hầu như mọi nơi trong trang nhưng tôi không thể tìm ra câu trả lời.Kết hợp hai mẫu chồng chéo với Perl

Vấn đề của tôi là: Tôi đang thực hiện một kịch bản PERL trong đó có để phát hiện vị trí của mỗi lần xuất hiện của mộthay khác mẫu trong một chuỗi.

Ví dụ:

$string = "betaalphabetabeta"; 
$pattern = "beta|alpha"; 

Trong trường hợp này, tôi muốn kịch bản của tôi để trở lại 4 trận đấu.

Tôi nghĩ rằng điều này có thể dễ dàng đạt được bằng cách sử dụng toán tử trận trong cách nọ cách kia như thế này:

$string =~ /beta|alpha/g; 

Tuy nhiên, kể từ khi hai mô hình của tôi ("alpha", "beta") đều được phần chồng chéo, các mảnh mã mà tôi vừa đăng bỏ qua bất kỳ sự xuất hiện nào của mẫu đầu tiên khi nó trùng lặp với mẫu thứ hai.

Ví dụ: nếu tôi có một chuỗi như thế này:

$string = "betalphabetabeta"; 

nó chỉ trả lại 3 trận đấu thay vì 4.

Tôi đã cố gắng để làm điều gì đó với toán tử =, nhưng tôi không thể quản lý để vợ chồng nó với toán tử OR một cách chính xác ...

Có ai có giải pháp nào không? Cảm ơn bạn đã giúp đỡ!

+0

bạn có thể gửi nhiều mã của bạn, ví dụ như phần trả lại số trận đấu? – Perleone

+3

[cách thực hiện-thay thế-chồng chéo-trùng khớp-với-một-perl-regex] (http://stackoverflow.com/questions/6572189/how-do-i-substitute-overlapping-matches-with-a -perl-regex) –

+0

@mugenkenichi well..the giải pháp quá phức tạp .. bạn có thể sử dụng 'lookahead' thay thế! – Anirudha

Trả lời

7

Sau đây sử dụng một sự khẳng định zero-width (Tôi tin đó là những gì nó được gọi là).

#!/usr/bin/perl 
use strict; 
use warnings; 

$_ = "betalphabetabeta"; 

while (/(?=(alpha|beta))/g) { 
    print $1, "\n"; 

Prints:

C:\Old_Data\perlp>perl t9.pl 
beta 
alpha 
beta 
beta 
5

Bạn phải sử dụng looakahead và đếm số lượng các trận đấu

(?=beta|alpha) 

Không thử nghiệm trong perl nhưng nên làm việc

làm việc here

+2

Bạn không cần parens trong '(beta | alpha)' vì bạn không sử dụng cho văn bản được chụp – fge

+0

@fge hmm..bạn đang phải ... – Anirudha

+0

(và có bằng cách này, điều này sẽ làm việc trong perl , vì nó là perl mà giới thiệu cách nhìn trong regexes: p) – fge

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