2013-01-10 9 views
5

Spero che la mia domanda non sia già stata posta da qualcun altro, poiché ho cercato di guardare quasi ovunque nel sito ma non sono riuscito a trovare una risposta.Corrispondenza con due pattern sovrapposti con Perl

Il mio problema è: Sto facendo uno script PERL che deve rilevare la posizione di ogni occorrenza di uno o di un altro modello in una stringa.

Per esempio:

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

In questo caso, vorrei il mio script di restituire 4 partite.

ho pensato che questo potrebbe essere realizzato facilmente utilizzando l'operatore di corrispondenza in qualche modo simile:

$string =~ /beta|alpha/g; 

Tuttavia, poiché le due modelli ("alpha", "beta") sono parzialmente sovrapposte, il pezzo del codice che ho appena postato ignora qualsiasi occorrenza del primo pattern quando si sovrappone al secondo.

E.g. se ho una stringa come questa:?

$string = "betalphabetabeta"; 

restituisce solo 3 partite invece di 4.

ho provato a fare qualcosa con l'operatore =, ma io non riesco a coppie con l'operatore OR in modo corretto ...

Qualcuno ha qualche soluzione? Grazie per l'aiuto!

+0

puoi pubblicare più del vostro codice, ad esempio la parte restituendo il numero di partite? – Perleone

+3

[how-do-i-sostitutivo-sovrapposizione-partite-con-un-perl-regex] (http://stackoverflow.com/questions/6572189/how-do-i-sostituire-overlapping-matches-with-a -perl-regex) –

+0

@mugenkenichi bene..la soluzione è troppo complessa lì..puoi usare 'lookahead' invece! – Anirudha

risposta

7

Di seguito utilizza un'asserzione a lunghezza zero (credo è così che si chiama).

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

$_ = "betalphabetabeta"; 

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

Stampe:

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

Devi usare looakahead e contare il numero di partite

(?=beta|alpha) 

non testato in Perl, ma dovrebbe funzionare

funziona here

+2

Non hai bisogno dei paren in '(beta | alpha)' dato che non hai usato il testo catturato – fge

+0

@fge hmm..hai ragione ... – Anirudha

+0

(e sì a proposito, questo funzionerà in perl , dal momento che è perl che ha introdotto i lookaround nelle regex: p) – fge

Problemi correlati