2013-01-10 20 views
5

Umarım bu soruyu zaten bir başkası tarafından yaratmadım, çünkü sitenin hemen her yerine bakmaya çalıştım ama bir cevap bulamadım.İki örtüşen paternin Perl ile eşleşmesi

Sorunum: Ben her olay tek veya bir dizede başka model arasında konumunu tespit etmek için olan bir PERL komut yapıyorum. Örneğin

:

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

Bu durumda, ben 4 eşleşmeleri dönmek benim programı istiyorum. ("Beta", "alfa")

$string =~ /beta|alpha/g; 

Ancak zaman iki desen, çünkü parça, kısmen üst üste edilir:

bu kolayca Bir şekilde, bu gibi eşleme operatörü kullanılarak elde edilebilir olduğu düşünülmektedir yeni gönderdiğim kodun ikinci kalıpla çakıştığı zaman ilk kalıbın oluşumunu atlar.

E.g. ? Ben böyle bir dize varsa: sadece bunun yerine = operatörü ile bir şeyler yapmaya çalıştık 4.

3 eşleşmeleri döndürür

$string = "betalphabetabeta"; 

ama çift yönetemez OR operatörü ile doğru şekilde ...

Herhangi bir çözümü olan var mı? Yardım ettiğin için teşekkür ederim!

+0

örneğin, eşleşme sayısını dönen kısmını kodunuzun daha gönderebilir? – Perleone

+3

[nasıl-yerine-i-yerine-örtüşen-ile-a-perl-regex eşleşir] (http://stackoverflow.com/questions/6572189/how-do-i-substitute-overlapping-matches-with-a -perl-regex) –

+0

@mugenkenichi iyi .. çözüm çok karmaşık var ... yerine 'lookahead' kullanabilirsiniz! – Anirudha

cevap

7

çalışır çalışması gerekir Bu ne denir ki).

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

$_ = "betalphabetabeta"; 

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

Baskılar:

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

Sen inanıyorum (looakahead kullanmak ve perl'de Test edilmedi maçları

(?=beta|alpha) 

sayısını saymak zorunda ama

şu sıfır genişlikli iddiasını kullanan here

+2

Yakalanan metinde – fge

+0

@ fge hmm için kullandığınız bu yana ((beta | alpha) 'da parens'e ihtiyacınız yoktur. Doğru ... – Anirudha

+0

(ve evet bu arada, bu perl olarak çalışacaktır) , bu regex içinde bakışları tanıttı perl olduğu için: p) – fge