2012-04-13 15 views
0

Ich habe einen regulären Ausdruck, die etwa wie folgt aussieht:Spiel alle möglichen Teile oder (|) mit NSRegularExpression

(\bee[0-9]{9}in\b)|(\bee[0-9]{9}[a-zA-Z]{2}\b) 

Nun, wenn der Eingabestring ee123456789ab ist dann der zweite Teil der | entspricht die Zeichenfolge. Aber wenn die Eingabezeichenfolge ist ee123456789in ersten Teil von | verbraucht die gesamte Zeichenfolge und der zweite Teil erhält keine Änderung, um die Zeichenfolge überein? Ich möchte, dass beide Teile von | ihre Änderung haben, damit sie der Zeichenkette entsprechen, so dass ich weiß, dass beide Teile die Zeichenkette erreichen konnten. Ist es sogar möglich, das mit regulärem Ausdruck zu tun?

+0

Dieses Beispiel macht nicht viel Sinn. * Sie * haben die Regexes konstruiert. Sie wissen also, dass jedes Mal, wenn * die erste Alternative übereinstimmt, die zweite auch übereinstimmt, weil die erste Regex eine "Teilmenge" der zweiten Regex ist. Warum würdest du das jemals brauchen? Können Sie sich ein realistischeres Beispiel vorstellen, das das eigentliche Problem zeigt, das Sie hier zu lösen versuchen? –

Antwort

1

können Sie lookahead assertions verwenden:

^(?=(ee[0-9]{9}in$)?)(?=(ee[0-9]{9}[a-zA-Z]{2}$)?) 

Dieses ein Spiel in beide \1 erfassen wird und \2; Wenn eines der beiden leer ist, hat der entsprechende Teil des Regex nicht gepasst.

Ich habe die Wortgrenzenanker zum Anfang/Ende von Stringankern geändert, da Sie mit der gesamten Zeichenfolge und nicht nur mit Teilstrings arbeiten.

In Python:

>>> import re 
>>> r = re.compile(r"^(?=(ee[0-9]{9}in$)?)(?=(ee[0-9]{9}[a-zA-Z]{2}$)?)") 
>>> m = r.match("ee123456789ab") 
>>> m.group(1) 
>>> m.group(2) 
'ee123456789ab' 
>>> m = r.match("ee123456789in") 
>>> m.group(1) 
'ee123456789in' 
>>> m.group(2) 
'ee123456789in' 

Erläuterung:

^    # Start of string 
(?=    # Look ahead to see if it's possible to match... 
(    # and capture... 
    ee[0-9]{9}in # regex 1 
    $    # (end of string) 
)?    # (make the match optional) 
)    # End of lookahead 
(?=    # Second lookahead, same idea... 
(
    ee[0-9]{9}[a-zA-Z]{2} 
    $ 
)? 
) 
+0

Perfekt! Vielen Dank für die Antwort! –

1

Mit regulären Ausdrücken ist das nicht möglich. Wenn ein Teil davon übereinstimmt, wird es als Übereinstimmung betrachtet. Sie müssten es mit zwei verschiedenen Ausdrücken machen und sehen, ob beide erfolgreich waren.

+0

Natürlich ist es möglich, es sei denn, Sie sprechen über Regex-Engines, die Lookahead nicht unterstützen (von denen nicht viele immer noch irgendwo verwendet werden). –

+0

Ich benutze es in einer iOS App und iOS unterstützt Lookahead. –

1

Ein OR eine oder egal was, nicht um das bekommen.
Wie @tim erwähnt kann es mit Lookahead (s) gemacht werden:

Sie können still stehen und den gleichen Text mehr als einmal ansehen.

So ist ein Weg, um jeden Ausdruck zu betrachten, ohne sich zu bewegen,
jeder Ausdruck ist optional. -

(?= (ee [0-9]{9} in)?) 
(?= (ee [0-9]{9} [a-zA-Z]{3})?) 

Das ist schlecht, weil, obwohl die Position nach dem letzten
Ausdruck vorantreiben wird, wird es nur 1 vorrücken interZeichenPosition. Es ermöglicht auch
ermöglicht Überlappung bei der Suche in einem globalen Kontext.

Die Suche kann durch den Verzehr von einem Zeichen beschleunigt werden -

(?= (ee [0-9]{9} in)?) 
(?= (ee [0-9]{9} [a-zA-Z]{3})?) 
. 

Der Motor hat eine Optimierung, wenn etwas verbraucht wird,
Fortschritte in der Chunks (unbekannt, wie es entscheidet).

Wenn Sie andere Ausdrücke enthalten, müssen Sie die Position
hier vorrücken lassen oder nichts wird übereinstimmen. Dies könnte auch
überlappenden Matching von Text (wenn das ein Ziel ist) zu beseitigen.

Sein wirklich schwer Überschneidungen zu vermeiden, wenn Sie sicher einen Ausdruck wissen
länger sein als die andere. Wenn das der Fall ist, dann können Sie immer eine bedingte
(falls vorhanden) machen den größeren Text zu konsumieren -

(?= (ee [0-9]{9} in)?) 
(?= (ee [0-9]{9} [a-zA-Z]{3})?) 
(?(2) \2 | \1) 

Und wenn Sie wissen, man eine Teilmenge der anderen ist, können Sie dies nur tun -

(?= (ee [0-9]{9} in)?) (ee [0-9]{9} [a-zA-Z]{3}) 

So oder so, je nach den Ausdrücken, viele Gedanken in der Entwicklung
Verbrauchs in die Regex gehen Überschneidungen zu vermeiden.

+0

Das ist eine gute Anregung. –

+0

@AnupamGodbole: Sie wissen, dass Sie hilfreiche Antworten upvote können, richtig? –

Verwandte Themen