Java Regex-Frage (Regulärer Ausdruck)

BaseUser

Ensign
Registriert
Feb. 2005
Beiträge
200
Hallo,

ich habe folgende Frage - bzw. eher ein Problem....

ich möchte folgende Buchstabenkombination aus einem String fischen:

KB923789

Also genau genommen soll nur die Kombination verwendet werden, welche dem Format

'KB[Zahl][Zahl][Zahl][Zahl][Zahl][Zahl]'

entspricht. 'KB' soll muss also vorkommen, die Zahlen können verschieden sein, hauptsache es sind 6 Stück.

dazu verwende ich den StringTokenizer:

PHP:
//...

String denim = " ";

//...

StringTokenizer st = new StringTokenizer(temp, denim);
while (st.hasMoreTokens()) 
{
  tempToken = st.nextToken();
						
  if(tempToken.matches(".[K][B][0-9][0-9][0-9][0-9][0-9][0-9]."))
  {
    //... Aktion
  }

Die Variable 'temp' enthält jeweils eine ganze Zeile, welcher mit FileReader aus einer Text-Datei gelesen wird - das funktioniert :)

Was nicht funktioniert ist mein Regex; ich glaube der ist falsch - denn er findet nicht alle! Lediglich 6 werden gefunden, er sollte aber 8 dieser Ausdrücke finden..!

Hier mal die Textdatei:

PHP:
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 
ClassGUID = {4c1077af-28f5-4869-a262-cfa16ec45544} 
. . . 
HKLM,"SOFTWARE\Microsoft\Advanced INF Setup\KB913433" 
HKLM,"Software\Microsoft\Active Setup\Installed Component\{1325db73-d9f1-48f8-
. . . 
Compid                     = "KB923789" 
CatalogFile                = "KB923789.CAT" 
 
Guid                       = "{5056b317-8d4c-43ee-8543-b9d1e234b8f4}" 
SP_TITLE                   = "Sicherheitsupdate für Windows (KB923789)" 


. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 
ClassGUID = {4c1077af-28f5-4869-a262-cfa16ec45544} 
. . . 
HKLM,"SOFTWARE\Microsoft\Advanced INF Setup\KB913433" 
HKLM,"Software\Microsoft\Active Setup\Installed Component\{1325db73-d9f1-48f8-
. . . 
Compid                     = "KB923789" 
CatalogFile                = "KB923789.CAT" 
 
Guid                       = "{5056b317-8d4c-43ee-8543-b9d1e234b8f4}" 
SP_TITLE                   = "Sicherheitsupdate für Windows (KB923789)" 

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 
ClassGUID = {4c1077af-28f5-4869-a262-cfa16ec45544} 
. . . 
HKLM,"SOFTWARE\Microsoft\Advanced INF Setup\KB913433" 
HKLM,"Software\Microsoft\Active Setup\Installed Component\{1325db73-d9f1-48f8-
. . . 
Compid                     = "KB923789" 
CatalogFile                = "KB923789.CAT" 
 
Guid                       = "{5056b317-8d4c-43ee-8543-b9d1e234b8f4}" 
SP_TITLE                   = "Sicherheitsupdate für Windows (KB923789)"

Kann mir hier jemand bei der Fehlersuche helfen? :)

Oder vielleicht hat jemand einen Link, wo die Verwendung von Regex recht einfach beschrieben ist (jaja, google kenne ich schon :) ).

Nachtrag: Er sollte 12 Ergebnisse liefern, nicht 8 :)
 
Zuletzt bearbeitet:
Zum Finden aller KB... in einem Text eignet sich folgendes Codeschnipsel vielleicht besser:
PHP:
Pattern patKB = Pattern.compile("(KB[0-9]{6})");
Matcher matchKB = patKB.matcher(text);
while (matchKB.find()) {
   System.out.writeln(matchKB.group(1));
}

Ein einzelner Punkt in deinem Regex steht für ein beliebiges Zeichen. Was du versucht hast ist denke ich ".*" für beliebiges Zeichen beliebiger Anzahl.
 
Zuletzt bearbeitet:
(KB[0-9]{6})? inwiefern du die klammern brauchst weiß ich nicht, aber eig sind runde klammern zum matchen da. das KB ist ja fix, wodurch das so übernommen werden kann und dass danach 6 ziffern kommen, drückst du mit [0-9]{6} aus. tutorial gibt es dazu hier.

wobei ich von regexps hier aber abstand nehmen würde, da dies ein wenig ineffektiv ist. wieso überprüfst du nicht einfach zeile für zeile und suchst nach KB, gefolgt von 6 ziffern? ist doch wesentlich einfacher und performanter.
 
Die Klammerung ist für die Ausgabe. Wenn man den gesamten Ausdruck ausgeben will reicht es auch ohne Klammerung. Der Match steht dann in matchKB.group(0). Wenn man nur die Zahlen ausgeben will dann hilft: "KB([0-9]{6})" und das Ergebnis ist im Index 1 zu finden: matchKB.group(1)
 
claW. schrieb:
wobei ich von regexps hier aber abstand nehmen würde, da dies ein wenig ineffektiv ist. wieso überprüfst du nicht einfach zeile für zeile und suchst nach KB, gefolgt von 6 ziffern? ist doch wesentlich einfacher und performanter.

Das...äh... war eigentlich auch der Plan... :rolleyes:

pvc-junkie schrieb:
Zum Finden aller KB... in einem Text eignet sich folgendes Codeschnipsel vielleicht besser:
PHP:
Pattern patKB = Pattern.compile("(KB[0-9]{6})");
Matcher matchKB = patKB.matcher(text);
while (matchKB.find()) {
   System.out.writeln(matchKB.group(1));
}

Ein einzelner Punkt in deinem Regex steht für ein beliebiges Zeichen. Was du versucht hast ist denke ich ".*" für beliebiges Zeichen beliebiger Anzahl.

Ich werde das mal probieren, danke erst mal für die Antworten!! :)
 
Hast du mir da ein Beispiel? :)

Ich weis ehrlich gesagt nicht wie das gehen soll ohne Regex...
 
lies die datei stück für stück ein, suche nach einem "KB" und wenn du dieses gefunden hast, dann überprüfst du, ob die nächsten 6 zeichen ziffern sind. weiter kann ich dir aber nicht helfen, da ich mit java bisher kaum was gemacht habe.
 
also stück für stück bedeutet aber nicht zeichenweise :-)
Du kannst wenn die Datei auch klein ist, sie komplett einlesen, Arbeitsspeicher ist i.d.R. verfügbar... selbst wenn sie mehrere MB hat, spricht nichts dagegen, der Vorteil ist, dass es dir nicht passieren kann dass das eine Stücl mit "K" aufhört und das nächste mit "B" anfängt...

Wenn du die Datei z.B. in einem String hast, könntest du dies von Anfang bis Ende (bzw zum acht letzten Zeichen) durchsuchen, wenn du "K" gefunden hast muss halt "B" folgen und 6 Ziffern...
Oder du nutzst die String-Methoden zum Suchen von KB (wichtig ist, dass du da immer den Suchindex anpasst)
 
nach "KB" suchen
--wenn gefunden: sind die nächsten 6 Zeichen in eine Zahl konvertierbar?
----wenn ja: ist diese Zahl kleiner oder gleich 999999
-------wenn ja: MATCH
 
Normalerweise macht man sowas mit Statemachines. Ist dann vor allem übersichtlicher.
Da es aber nicht sonderlich kompliziert ist, gibt es sicherlich genügend andere Methoden.
 
Zurück
Oben