7

サイトのほぼすべてを見ようとしたのですが、答えを見つけることができなかったので、私の質問がまだ他の誰かによって提起されていないことを願っています.

私の問題は次のとおりです。文字列内の1つまたは別のパターンのすべての出現位置を検出する必要があるPERLスクリプトを作成しています。

例えば:

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

この場合、スクリプトで 4 つの一致を返すようにします。

これは、次のような方法で match 演算子を使用することで簡単に実現できると考えました。

$string =~ /beta|alpha/g;

ただし、私の 2 つのパターン (「アルファ」、「ベータ」) は部分的に重複しているため、投稿したばかりのコードは、最初のパターンが 2 番目のパターンと重複する場合はスキップします。

たとえば、次のような文字列がある場合:

$string = "betalphabetabeta";

4 ではなく 3 つの一致のみを返します。

?= 演算子を使って何かしようとしましたが、正しい方法で OR 演算子と組み合わせることができません...

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

4

2 に答える 2

8

以下では、ゼロ幅のアサーションを使用しています (そう呼ばれていると思います)。

#!/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
于 2013-01-10T14:16:23.520 に答える
5

一致数を使用looakaheadしてカウントする必要があります

(?=beta|alpha)

perl でテストされていませんが、動作するはずです

ここで働く

于 2013-01-10T14:11:25.957 に答える