2016-06-30 15 views
0

Zum Beispiel habe ich strings „Domäne“, „asset44.domain“, „asset.domain“, „domain1“Perl reguläre Ausdrücke mit Ausnahme

ich mit regulären Ausdrücken, wo alle Strings entsprechen müssen, ist „domain“ Wort , aber mit einer Ausnahme: Ich brauche keine Übereinstimmung "asset44.domain" und "domain1".

Zuerst habe ich if ($_ =~ /domain/io) { Es ist passend zu allen Saiten

Nachdem ich if ($_ =~ /domain(?!1)/io) { setzen Es ist passend zu allen Zeichenfolge, außer „domain1“

Und jetzt, ich kann nicht verstehen, wie „asset44 auszunehmen. Domain ", aber behalten Sie die Übereinstimmung" asset.domain "bei.

P.S. asset44.domain kann eine andere Nummer sein: zB asster56.domain.

P.P.S Lösung:(?<!asset)(?<!\d\.)domain(?!1) https://regex101.com/r/sF2qG3/1

+0

Über den '/ o' Modifikator, sagt die [doc] (http://perldoc.perl.org/perlre.html)' o - vorgeben, um Ihren Code zu optimieren, aber tatsächlich Bugs einzuführen. – Dada

Antwort

2

Nur eine Idee:

if ($_ =~ /domain/ and (not $_ =~ /domain1/ or $_ =~ /asset44/)){ 
    # do whatever 
} 

UPDATE:

[^asset[0-9]domain[^domain1] 

Hier ist eine Demo: regex101.com/r/rJ4vC6/1

+0

Dies wäre der Ansatz, den ich annehmen würde - der Versuch, bedingte Logik wie diese in 'regex' zu erstellen, ist bestenfalls fehleranfällig und wird wahrscheinlich für zukünftige Leser verwirrend sein. Wo mehrere Tests angewendet werden, ist viel klarer. – Sobrique

+0

Ich habe vergessen zu sagen, dass "asse44.domain" zum Beispiel "asset56.domain" sein kann. Zufällige Zahlen. Und ich mag das UND/ODER ... Es muss einen Weg geben, der es ohne UND/ODER tut. Aber wenn ich keinen besseren Weg finde, werde ich es versuchen. Danke. – user2481034

+0

Dann könntest du folgendes versuchen: [^ asset [0-9] domain [^ domain1] Hier ist eine Demo: https://regex101.com/r/rJ4vC6/1 – Ramzendo

0

Haben Sie einen Versuch mit:

^([a-zA-Z]+\.)?domain$ 

Wir passen eine optionale Sub-Domäne mit ([a-zA-Z]+\.)?
und String domain, mit nichts dahinter

es richtig angezeigt zu here

+0

Ihr Beispiel entspricht "Asset" Wort in "Asset.domain" und das ist alles. Aber ich brauche, dass 2 Strings von 4 übereinstimmen. Es ist "Domain" und "Asset.domain". – user2481034

+0

Meinen Sie, dass Sie 2 Ergebnisse von der Regex benötigen (siehe https://regex101.com/r/sN6wH7/3)? – Cyrbil

+0

Entschuldigung, wenn meine Frage nicht genau war. Dein reguläres Gut, aber nicht gut für string, wenn ich zum Beispiel "Ninja war asset.domain und domain1", weil in deinem Code^und $. Ich habe bereits eine Lösung und thx wieder für Ihre Hilfe gefunden. – user2481034