2016-05-20 12 views
0

"@"に10回以上出現したときに正規表現が必要です。文字列にはカンマ区切りの電子メールアドレスが含まれるため、@は決して隣にはありません。Regex - 文字列中のx個以上の文字列(異なる位置)

@ {10、}は10個の@が連続している場合にのみ機能します。文字列に10個以上の@があるときに動作する必要があります。 TIA!

+2

技術的には、[電子メールアドレスのローカル部分に許可されている '@'](https://en.wikipedia.org/wiki/Email_address#Syntax)、これだけ@ 'の数をカウントします'あなたに間違った結果を与える可能性があります。私はCSVパーサであなたのリストを解析するより "正しい"方法があると思っていますが、カンマも電子メールで許可されているので、正しく引用されエスケープされたCSVがあればうまくいきます。 – ThisSuitIsBlackNot

+1

正規表現がこれを処理する最良の方法であるということに私は同意しませんが、あなたが主張するならば、単純に '/(\ @。+){10、} /'を実行すれば1つ以上文字を '@ 'の10個(またはそれ以上)のインスタンスすべてを区切ります –

答えて

1

次のパターンが10以上@と文字列と一致する:

@.*@.*@.*@.*@.*@.*@.*@.*@.*@.*@ 

最適化された後(.[^@])、冗長性を除去した、マッチオペレータに埋め込まれ、それは次のようになる:

/\@(?:[^\@]*\@){10}/ 

ある時点で、「10以上」ではなく「10+」を探したかったとします。それのために、あなたは使います。

/\@(?:[^\@]*\@){9}/ 
+0

これは、ありがとう! – Oleg

+0

答えがあればそれを受け入れるべきです。 – Andrew

2

質問に答えるには、 "saturn"演算子を使用して正規表現内の一致数を数えることができます。

use warnings; 
use strict; 

my $str = '[email protected], [email protected], [email protected]@@@[email protected]@@@, @'; 

my $count =()= $str =~ /@/g; 

if ($count > 10){ 
    ... 
} 

はここ仲介$count変数せずに例を示します言っ

if ((() = $str =~ /@/g) > 10){ 

は、私がここに最善の方法ではないかもしれないという正規表現にコメント他者と思います。

+0

うわー、それはどうしてgoatse演算子ですか?あなたはひどい思い出を持ち帰っています。 – Andrew

+0

今はそれが分かりません。 =、( – Andrew

+1

は私の答えを更新してその名前を削除しました:) – stevieb

関連する問題