RegExp Verwirrung

7

Ich bin neu im Java-Konzept des regulären Ausdrucks.

Könnte mir bitte jemand den korrekten regulären Ausdruck mitteilen, den ich für die folgende Zeichenfolge verwenden soll -

String exp = "ABCD_123_abc".

und der reguläre Ausdruck, den ich für die obige Zeichenfolge verwende, ist:

regExp = "([a-zA-Z]+)_([0-9]+)_([a-z]+)"

Aber die Ausgabe des unteren Codes ist "**No Match Found**"

%Vor%     
Sonia 19.03.2013, 09:45
quelle

8 Antworten

12

Das Problem ist: Sie haben versehentlich die Verwendung des regexp-Musters und des zu überprüfenden Ausdrucks

vertauscht %Vor%

Sollte verwendet werden

%Vor%

Die Die Funktion Pattern.compile (String regex) akzeptiert den regulären Ausdruck.

BEARBEITEN

Ich entschuldige mich, meine erste Lösung war wirklich etwas, das nie getan werden sollte: die Namen der Variablen widersprachen der Bedeutung ihrer Werte. .. Das bedeutet Schmerz und Tränen, und von wütenden Kollegen getroffen zu werden, während angeschrien wird. Und es gibt keine gültige Verteidigung gegen dieses Verbrechen ...

EDIT2 Sie können die einzelnen übereinstimmenden Gruppen durch die Matcher.group (int) Funktion:

%Vor%

Hinweis: Ich habe 2 als Argument verwendet:

  • 0 bedeutet die übereinstimmende Eingabefolge
  • 1 bedeutet die erste Gruppe ( ABC in diesem Fall)
  • ... und so weiter

Wenn Sie nur den 123 -Teil benötigen, schreibe ich die Regex aus Gründen der Übersichtlichkeit neu:

%Vor%

In diesem Fall muss jedoch group() mit 1 aufgerufen werden, da jetzt die erste (und einzige) übereinstimmende Gruppe die erste ist:

%Vor%     
ppeterka 19.03.2013, 09:46
quelle
8

Sie kompilieren den regulären Ausdruck nicht. Du brauchst

%Vor%

d. Der obige Code verwirrt die Regexp- und die Eingabezeichenfolge. Ihre tatsächliche Regexp ist jedoch korrekt.

    
Brian Agnew 19.03.2013 09:47
quelle
5

Ihre Regex ist vollkommen in Ordnung .

Das Problem rührt daher, dass Sie exp und regExp in Ihrem Code vertauscht haben. Die Funktion compile verwendet als Argument einen regulären Ausdruck, während die Funktion matcher den Ausdruck als übereinstimmend ansieht.

    
alestanis 19.03.2013 09:47
quelle
4

Ihre (redigierte) Regexp ist in Ordnung.

Wenn Sie 123 extrahieren möchten, können Sie matcher.group(2) verwenden. Diese Methode kann nur aufgerufen werden nach matches oder find . matcher.group(n) gibt das n-te capture group zurück. Eine Erfassungsgruppe ist ein Teil Ihrer Regexp, der in Klammern eingeschlossen ist. matcher.group(0) gibt die übereinstimmende Zeichenfolge zurück.

Beispiel

%Vor%

druckt

%Vor%     
Javier 19.03.2013 10:04
quelle
2

if(exp.matches(regExp))

Das allein reicht. Sie brauchen kein Muster / Matcher, es sei denn Sie haben andere Bedürfnisse.

    
SudoRahul 19.03.2013 09:47
quelle
1

In diesem Fall, wenn Sie 123 abrufen möchten, verwenden Sie den folgenden Code:

%Vor%

Diese Ausgabe wird wie folgt ausgegeben: 123

Ihre Regex ist völlig in Ordnung.

    
Ankur Shanbhag 19.03.2013 10:07
quelle
1

Dieses Muster funktioniert - es passt zu einer beliebigen Zahl von Groß- oder Kleinbuchstaben, dann zu einem Unterstrich, dann zu einer beliebigen Anzahl von Ziffern, dann zu einem Unterstrich und dann zu einer beliebigen Anzahl von Groß- oder Kleinbuchstaben. Wenn Sie genauer sein möchten, können Sie {n} anstelle von + verwenden, um eine bestimmte Anzahl von Zeichen zu finden.

%Vor%     
Boris the Spider 19.03.2013 10:10
quelle
0

Kompiliere zuerst den regulären Ausdruck und vergleiche ihn dann mit Matcher ..

%Vor%     
sasi 19.03.2013 09:48
quelle

Tags und Links