Ich versuche, Regex zu schreiben, aber in einigen Fällen funktioniert es nicht. Hier ist die regexRegex Matching kürzeste Übereinstimmung statt längste
(\/[ABCGIKLNPRSUV])?(\/RC-[A-Z0-9]{2,6})?
Die Spiele eine der folgenden sein könnte
- /R/RC-ABC123
- /R
- /RC-ABC123
Die über Regex funktioniert für/R und/R/RC-ABC123 aber nicht/RC-ABC123. Für/RC-ABC123 wird der Vergleich mit der ersten Gruppe und nicht mit der zweiten Gruppe durchgeführt und nur/R als übereinstimmende Komponente verwendet.
Wie kann ich es für alle Fälle funktionieren lassen. Außerdem ist der obige Ausdruck nur ein Teil des vollständigen Ausdrucks, d. H. Es könnte eine andere (dritte) Gruppe nach RC-ABC123 geben. Aber ich möchte zuerst für diese 2 Gruppen arbeiten.
Aktualisieren Das ?? scheint in regex101 zu funktionieren, aber nicht in Java. Ich erhalte 2 Gruppen, aber mit Null-Werten für/R/RC-ABC123 mit dem folgenden Code
Pattern pattern = Pattern.compile("(/[A-Z])??(/RC-[A-Z0-9]{2,6})?");
Matcher matcher = pattern.matcher("/R/RC-ABC12345");
if(matcher.find()) {
for(int i=1; i<= matcher.groupCount(); i++) {
System.out.println("Group("+i+") = " + matcher.group(i));
}
}else {
System.out.println("Pattern does not match");
}
FYI nur, paßt es die erste optionale Gruppe, so dass es an dieser Stelle getan hat. Haben Sie versucht, die Anker '^' und '$' einzufügen, damit * ein vollständiger Eintrag gefunden werden muss? – usr2564301
Probieren Sie ['(/R(?:C-[A-Z0-9]{2,6})?)(()%BCGIKLNPSUV])">(https://regex101.com/r/xA9fA2/1). Hinweis in Java regex, Sie müssen nicht '/' entkommen. –
Sie können ein optionales Element nicht gierig machen, indem Sie '' 'anstelle von' ' – Barmar