2017-06-01 6 views
2

Ich verwende ein Java-Regex-Muster in einer Anwendung, die nur den Zugriff auf den gesamten Match-Wert erlaubt (dh ich kann keine einfangenden Gruppen verwenden).Java-Regex-Lookbehind-Problem mit Quantifizierern

Ich versuche, Werte aus meinem Beispieltext zu extrahieren:

C02 SURVEY : 2010 F10446P BONAPARTE 2D 

Im obigen Beispiel I für das Schlüsselwort SURVEY und Wert extrahiert nach diesen : müssen überprüfen müssen. Und wollte ich meine Ausgabe sein:

2010 F10446P BONAPARTES 2D

ich das Muster verwendet (?<=(?i)survey\s{2}[:])(?:(?![\n]).)*

In diesem Muster habe ich die Räume fest einprogrammiert 2 sein (\s{2}) EVENTUELL variieren und nicht konstanten Wert.

Ich muss Quantifizierer mit Lookbehind-Operation verwenden.

Wenn eine andere Option vorhanden ist, lassen Sie es mich bitte wissen.

+0

Entfernen Sie den Lookbehind und verwenden Sie eine Erfassungsgruppe über dem Muster, das Sie extrahieren müssen. Übrigens stimmt ein Punkt nicht mit einem Zeilenumbruch überein. Verwenden Sie '(? I) Umfrage \ s *: (. *)' –

+1

Was ist die Regex-Engine? –

+0

Meine Anwendung wiederum verwendet Java, um die Übereinstimmung zu extrahieren. So wird die vollständige Übereinstimmung zurückgegeben – DeviN

Antwort

0

Sie können eine Funktion in einer Java Regex-Engine nutzen, die "constrained width lookbehind" genannt wird:

Java akzeptiert quantifiers innerhalb Lookbehind, solange die Länge der passenden Strings innerhalb eines vorher festgelegten Bereich. Zum Beispiel ist (?<=cats?) gültig, weil es nur Zeichenfolgen von drei oder vier Zeichen abgleichen kann. Ebenso ist (?<=A{1,10}) gültig.

Das bedeutet, können Sie den {2} Begrenzung quantifier mit einem Begrenzungs quantifier sowohl mit Minimal- und Maximalwerten ersetzen, z.B. {0,100}, um null bis hundert Whitespacesymbole zuzulassen. Passen Sie sie so an, wie Sie es für richtig halten.

Außerdem müssen Sie kein temperiertes gieriges Token (?:(?![\n]).)* verwenden, da der Punkt in Java-Regex nicht mit einem Zeilenumbruch übereinstimmt. Ersetzen Sie es einfach durch .*, um alle anderen Zeichen als newline zu finden. So könnte Ihr Muster so einfach aussehen wie (?i)(?<=survey\s{0,100}:).*.