2017-01-20 3 views
0

Ich habe einen regulären Ausdruck erstellt, die für E-Mail-Adressen zu meiner Domain fred.com sucht, die mit „ar“ beginnen wie folgt:regexp: ausschließen Teilworte aus dem längeren Wort

(^ar.*)+(@fred\.com$) 

so alle E-Mail-Adressen, aussehen wie ar*@fred.com wird übereinstimmen. Ich denke, der obige Code ist korrekt und wird das erreichen.

ABER, ich möchte die Adresse [email protected] ausschließen, so wird das resultierende Spiel

d Ich möchte ar*@fred.com UND NICHT [email protected]

wie falsch sein kann ich das tun?

+0

Welche Programmiersprache oder Texteditor verwenden Sie? –

+0

Danke. Leider liest die App das ich als falsche Syntax ein – Arthur

+0

Ich bin im Googles Routing Setup in ihrer G-Suite/Mail App. Es fragt nach (Regex) Mustererkennung – Arthur

Antwort

0

Zunächst einmal können Ihre erste Regex vereinfacht werden:

^(ar.*)@fred.com$ 

die nun alle E-Mails in Form von ar*@fred.com

übereinstimmen Um Ihre Frage zu beantworten: Dies ist eine mögliche Lösung:

^(ar(?!(?:thur|bla)@).*)@fred.com$ 

die alles aber [email protected] Spiele und [email protected] und hat alles, was vor dem @ in der Capture-Gruppe

See here für einige Beispiele

+0

sieht vielversprechend aus, aber die Engine Im in sagt falsche Syntax – Arthur

+0

@Arthur können Sie versuchen, dieses Zeug zu entfernen: Entfernen Sie die Capture-Gruppe (äußerste Klammer; Sie werden es sowieso nicht brauchen); Entferne^und $ (weiß nicht, ob du sie für die Mustererkennung in deinem Fall brauchst); Entfernen Sie den?: Teil im innersten Teil. Sie können auch versuchen,/vor und nach dem Ausdruck (Javascript tut das - sieht wie/Regex /) und das @ -Zeichen (sehr unwahrscheinlich, das Problem zu sein; \ @) –

0

Wie von Michael Ritter erwähnt, kann Ihre regex vereinfacht werden.

Sie müssen die "subpattern property" (weiß nicht den genauen Begriff) ->?!

in PHP gemacht Test:

<? 
$regex = '/^(ar([email protected]$)[a-zA-Z0-9_-]*?)@fred.com$/'; 
// Or this one should do the trick, but it is a way more permissive 
//$regex = '/^ar((([email protected]$).*?)[^^@])[email protected]$/'; 
foreach(array('[email protected]', '[email protected]', 'arthur^@fred.com', '[email protected]@fred.com', '[email protected]', '[email protected]', '[email protected]') as $email){ 
    echo $email . ' => ' . (preg_match($regex, $email) ? 'ALLOW' : 'DENY') . "\n"; 
} 
?> 

Diese Ausgänge:

C:\Users\rbala\php\tools>..\php\php5.2.10\php.exe regexNot.php 
[email protected] => DENY 
[email protected] => ALLOW 
arthur^@fred.com => DENY 
[email protected]@fred.com => DENY 
[email protected] => ALLOW 
[email protected] => ALLOW 
[email protected] => ALLOW 
  • Die ersten regulären Ausdruck zwingt Sie die Zeichen sagen, Sie wollen
  • Für die zweite zwingt Sie zu sagen, die Zeichen, die Sie nicht möchten [^^ @] => NOT^@ vor @

Ich sehe keine anderen Möglichkeiten nur mit Regex.

@TaoStyle: Thx für die Spitze. Ich kann nicht Ihre Beiträge kommentieren ... Ihre regex die folgenden Muster entsprechen:

arthur^@fred.com => ALLOW 
[email protected]@fred.com => ALLOW 
+0

Die Regex, die Sie vorschlagen würde fälschlicherweise als FALSE E-Mail zurückgeben wie 'arthurad @ fred.com', da das'. * 'zwischen dem Ausdruck Arthur und' @ 'steht. Ich spielte mit dem gleichen Gedankenprozess, wusste aber noch nicht, wie ich diese Einschränkung umgehen sollte. – TaoStyle

+0

@TaoStyle: Ihre völlig richtig !!! Ich bearbeite, sobald die Antwort richtig ist. – zenko

Verwandte Themen