2017-07-23 1 views
4

Perl RegEx und PCRE (Perl-kompatible RegEx) unter anderen haben die Kurzschrift \K, um alle Übereinstimmungen auf der linken Seite zu verwerfen, außer für die Erfassung von Gruppen, aber Java unterstützt es nicht, also was ist Java äquivalent dazu?Java Reguläre Ausdrücke, die PCRE/etc. Entsprechen Kurzschrift ` K`?

+0

Enthält der linke Teil Muster variabler Länge? – revo

+0

Es gibt keine Entsprechung in Java. Sie können jedoch mit Capture-Gruppen erhalten, was Sie wollen. Die Verwendung eines Lookbehind ist manchmal möglich, ist aber meistens weniger effizient. –

+0

@revo Normalerweise tut es das. – rautamiekka

Antwort

3

Es gibt keine direkte Entsprechung. Sie können solche Muster jedoch immer mit Erfassungsgruppen neu schreiben.

Wenn Sie sich den \K Operator und seine Einschränkungen genauer ansehen, sehen Sie, dass Sie dieses Muster durch Erfassungsgruppen ersetzen können.

Siehe rexegg.com \K reference:

In der Mitte eines Musters, \K sagt „setzen Sie den Anfang des zu diesem Punkt berichtet Spiel“. Alles, was vor dem \K gefunden wurde, wird nicht gemeldet, ein bisschen wie in einem Lookbehind. Der entscheidende Unterschied zwischen \K und einem Lookbehind besteht darin, dass in PCRE ein Lookbehind die Verwendung von Quantifizierern nicht zulässt: Die Länge dessen, nach der Sie suchen, muss festgelegt sein. Auf der anderen Seite kann \K irgendwo in einem Muster fallen gelassen werden, so dass Sie frei haben, irgendwelche Quantifizierer zu haben, die Sie vor dem \K mögen.

jedoch, all dies bedeutet, dass das Muster vor \K noch ist ein verzehrendes Muster, dh der Regex-Engine den angepassten Text an den Übereinstimmungswert addiert und rückt seinen Index, während der Pattern-Matching, und \K löscht nur den übereinstimmenden Text aus der Übereinstimmung, wobei der Index beibehalten wird. Dies bedeutet, dass \K nicht besser ist, als Gruppen zu erfassen.

So ein value\s*=\s*\K\d+ PCRE/Onigmo Muster in diesem Java-Code übersetzen würde:

String s = "Min value = 5000 km"; 
Matcher m = Pattern.compile("value\\s*=\\s*(\\d+)").matcher(s); 
if(m.find()) { 
    System.out.println(m.group(1)); 
} 

Es ist eine Alternative, aber das kann nur mit kleineren, einfacheren Muster verwendet werden. A constrained width lookbehind:

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

Also, das wird auch funktionieren:

m = Pattern.compile("(?<=value\\s{0,10}=\\s{0,10})\\d+").matcher(s); 
    if(m.find()) { 
     System.out.println(m.group()); 
    } 

die Java demo See.

+1

Ja, funktioniert genau wie gewünscht. Vielen Dank. – rautamiekka