2013-01-10 18 views
5

サイト内のほとんどの場所を見ようとしたが、私の質問はまだ他の人によって引き起こされていないことを願っていますが、Perlで重複する2つのパターンを一致させる

私の問題は、次のとおりです。私はすべての出現1 または文字列内の別のパターンのの位置を検出するために持っているPerlスクリプトを作ってるんです。例えば

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

この場合、私は4試合を返すように私のスクリプトをしたいと思います。

私は、これが容易に何らかの方法このように一致演算子を使用することによって達成することができることを考えた:

$string =~ /beta|alpha/g; 

しかし、私の二つのパターン(「アルファ」、「ベータ」)、片部分的に重なっているので私がちょうど投稿したコードは、最初のパターンが2番目のパターンと重なったときにそれをスキップします。

など。私はこのような文字列がある場合:?

$string = "betalphabetabeta"; 

をそれだけで私は=演算子との何かをしようとしましたが、私はカップルに管理することはできません代わりに4

の3試合を返します。それは正しい方法でOR演算子とそれ...

誰にも解決策はありますか?ご協力いただきありがとうございます!

+0

あなたのコードの多くを投稿することができ、例えば一部が一致の数を返しますか? – Perleone

+3

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

+0

@mugenkenichi well ..このソリューションは複雑すぎます。代わりに 'lookahead'を使うことができます! – Anirudha

答えて

7

に動作します動作するはずですそれはそれが呼ばれているものです)。

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

$_ = "betalphabetabeta"; 

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

プリント:

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

あなたは、私は信じている(looakaheadを使用してperlでテストされていない試合

(?=beta|alpha) 

の数をカウントする必要がありますが

は以下のゼロ幅アサーションを使用していますhere

+2

キャプチャされたテキストに使用されていないので、 '(beta | alpha)'に括弧は必要ありません。 – fge

+0

@fge hmm..you right ... – Anirudha

+0

(そして、はい、これはperlで動作しますこれは正規表現のルックアラウンドを導入したperlだからです:p) – fge