2013-01-10 7 views
5

Mam nadzieję, że moje pytanie nie zostało już zadane przez kogoś innego, ponieważ próbowałem wyglądać prawie wszędzie na stronie, ale nie mogłem znaleźć odpowiedzi.Dopasowanie dwóch zachodzących na siebie wzorców z Perlem

Mój problem jest: Robię skrypt Perla, który ma wykrywać pozycję każde wystąpienie jednego lub inny wzór na sznurku.

Na przykład:

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

W tym przypadku, chciałbym mój skrypt do powrotu 4 mecze.

mi, że, że mogą być łatwo osiągnięte za pomocą operatora dopasowania w jakiś sposób jak poniżej:

$string =~ /beta|alpha/g; 

jednak od swoich dwóch wzorów („alfa”, „beta”) częściowo nakładających się kawałek kodu, który właśnie napisałem, pomija wystąpienie pierwszego wzorca, gdy pokrywa się z drugim.

E.g. jeśli mam ciąg jak ten:

$string = "betalphabetabeta"; 

tylko zwraca 3 mecze zamiast 4.

Starałem się zrobić coś z = operatora, ale nie uda się para to z operatorem OR w prawidłowy sposób ...

Czy ktoś ma jakieś rozwiązanie? Dzięki za pomoc!

+0

można pisać więcej kodu, na przykład część powracającego liczbę meczów? – Perleone

+3

[how-do-i-substitute-overlapping-matches-with-a-perl-regex] (http://stackoverflow.com/questions/6572189/how-do-i-substitute-overlapping-matches- with-a -perl-regex) –

+0

@mugenkenichi well..to rozwiązanie jest zbyt skomplikowane .. zamiast tego możesz użyć 'lookahead'! – Anirudha

Odpowiedz

7

Poniższa korzysta z zerowej szerokości twierdzenie (wierzę tak to się nazywa).

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

$_ = "betalphabetabeta"; 

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

Wydruki:

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

Musisz użyć looakahead i policzyć liczbę meczów

(?=beta|alpha) 

nie testowano w Perlu, ale powinien działać

działa here

+2

Nie potrzebujesz paren w '(beta | alfa)', ponieważ nie jesteś użyty do przechwyconego tekstu – fge

+0

@ fge hmm .. masz rację ... – Anirudha

+0

(i tak przy okazji, to zadziała w perlu , ponieważ jest to perl, który wprowadził lookarounds w wyrażeń regularnych: p) – fge

Powiązane problemy