2016-05-20 3 views
0

Ich brauche Regex, um zu finden, wenn "@" mehr als 10 Vorkommen hat. Die Zeichenfolge enthält E-Mail-Adressen, die durch Kommas getrennt sind, sodass @s niemals nebeneinander liegen.Regex - Zeichen, das mehr als x Mal in einer Zeichenfolge (in verschiedenen Positionen) vorkommt

Was ich habe, ist @ {10,} funktioniert nur, wenn 10 @s in einer Reihe sind. Ich muss dafür arbeiten, wenn 10+ @s in der Zeichenfolge sind. TIA!

+2

Technisch [ '@' im lokalen Teil einer E-Mail-Adresse erlaubt] (https://en.wikipedia.org/wiki/Email_address#Syntax), so dass nur die Anzahl der '@ Zählen' s könnte Ihnen ein falsches Ergebnis geben. Ich denke, der "richtige" Ansatz wäre es, Ihre Liste mit einem CSV-Parser zu analysieren, aber das funktioniert natürlich nur, wenn Sie eine CSV-Datei mit korrektem Anführungszeichen haben, da in E-Mails auch Kommas erlaubt sind. – ThisSuitIsBlackNot

+1

Ich stimme nicht zu, dass eine Regex der beste Weg ist, um damit umzugehen, aber wenn Sie darauf bestehen, können Sie einfach '/ (\ @. +) {10,} /', was 1 oder mehr erlauben würde Zeichen, um alle 10 (oder mehr) Instanzen von '@' zu trennen –

Antwort

1

das folgende Muster übereinstimmt Zeichenfolge mit mehr als 10 @:

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

Nach optimierte (.[^@]) mit Redundanzen entfernt und in ein Spiel Operator eingebettet ist, wird es die folgende:

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

An einem Punkt sagten Sie, Sie wollten "10+" anstelle von "mehr als 10" finden. Dafür würden Sie verwenden.

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

Das funktioniert, danke! – Oleg

+0

Sie sollten die Antwort akzeptieren, wenn es funktioniert. – Andrew

2

Um Ihre Frage zu beantworten, können Sie die Anzahl der Übereinstimmungen in einer Regex mit dem Operator "Saturn" zählen.

use warnings; 
use strict; 

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

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

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

Hier ist ein Beispiel ohne Zwischen $count Variable:

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

Das heißt, ich bin mit den anderen, die in diesem regex kommentiert kann hier nicht der beste Ansatz sein.

+0

Ugh, warum wird es ein Ziegenoperator genannt? Du bringst schreckliche Erinnerungen zurück. – Andrew

+0

Vergiss es, ich sehe es jetzt. =, ( – Andrew

+1

aktualisierte meine Antwort und entfernte diesen Namen :) – stevieb

Verwandte Themen