String auf Muster überprüfen

Todesbote

Mitglied
Hallo zusammen,

ich lese in meinem Java Programm Strings dieser Art:
%5C8307_Am_Goldberg_______%5CLOG-DLC.CSV
%5C8307_Hechtweg_______%5CLOG-DLC.CSV
....
ein.
Nun möchte ich die Strings verändern da einige Informationen nicht benötigt werden.

Es soll:
8307_Am_Goldberg
2092_Hechtweg
gespeichert werden.
Der String den ich haben möchte besteht immer aus 4 Ziffern, Unterstrich und Text mit/ohne Unterstrich.

Wie kann ich dies am besten realisieren?

Würde das mit regex funktionieren?
Bisher habe ich regex nur 1x verwendet um einen String zu überprüfen.
Kann ich nach dem selben Muster vorgehen wie bei einer Überprüfung?
Sprich ich durchsuche den String und speichere mir
\\d\\d\\d\\d_[A-Z][a-z]*.[A-Z][a-z]*.
Wäre mal so ne Idee von mir, bin mir aber nicht sicher ob und wie sich das realisieren lässt.

mfg
 
Was in der API-Beschreibung zur Klasse [JAPI]Pattern[/JAPI] versteht Du denn nicht?

bye
TT

Mir ist klar das ich mit der Klasse Prüfen kann ob ein String einer bestimmten Zeichenfolge entspricht.
Nur bekomme ich da mit dem folgenden Muster nicht Probleme?
\\d\\d\\d\\d_[A-Z][a-z]*.[A-Z][a-z]*
Ich weiß der . steht für beliebige Zeichen.
Wenn ich nun 8307_Am_Goldberg haben möchte dann passt das Muster ja aber bei 2092_Hechtweg hab ich ja dann keinen Unterstrich.
Dann sucht das Muster mit [A-Z][a-z]* ja bis zu Hechtweg_.
Bekomme ich dann nicht eine Fehlermeldung weil ja nach _ ein weiterer _ kommt anstatt von [A-Z]??
 
Durch einigermaßen geschicktes Bauen des Patterns und unter Verwendung sogenannter Capturing Groups geht es recht leicht:
Java:
  // Diese Werte stehen vorher fest, deswegen konstant
  // Regex fürs matchen und capturen des relevanten Teils.
  // Trick sind die runden Klammern, sog. Capturing Group
  static final String regex = "%5C(\\d{4}_[A-Za-z_]*[A-Za-z]{1}).*";
  // Das vorkompilierte Pattern
  static final Pattern pattern = Pattern.compile(regex);

  /**
   * @param args
   */
  public static void main(String[] args) throws Exception {

    // Diese Werte sind dynamisch
    String eingabe = "%5C8307_Am_Goldberg_______%5CLOG-DLC.CSV";

    Matcher matcher = pattern.matcher(eingabe);
    
    matcher.matches();

    System.out.println(matcher.group(1));

    eingabe = "%5C8307_Hechtweg_______%5CLOG-DLC.CSV";

    matcher = pattern.matcher(eingabe);
    
    matcher.matches();

    System.out.println(matcher.group(1));

  }
 
Zuletzt bearbeitet von einem Moderator:
Wenn du ein Problem hast und jemand sagt du sollst es mit RegEx lösen... dan hast du zwei Probleme ;-)

Und wenn dann jemand sagt, diese beiden lösen zu können, indem man ein 15seitiges Tutorial durcharbeitet, hat man drei 😀 (RegEx sind schon "cool"...
xkcd: Regular Expressions
... aber ich bin ja bei sowas OFT (bzw. LANGE) ein Fan von pragmatischem, sprechendem indexOf("_")/substring(...) ... )
 
Und wenn dann jemand sagt, diese beiden lösen zu können, indem man ein 15seitiges Tutorial durcharbeitet, hat man drei 😀 (RegEx sind schon "cool"...
xkcd: Regular Expressions
... aber ich bin ja bei sowas OFT (bzw. LANGE) ein Fan von pragmatischem, sprechendem indexOf("_")/substring(...) ... )
[OT]Naja, wenn man vom Handbohrer zu CNC-Fräse wechselt ist nun mal lesen der Bedienungsanleitung angesagt...[/OT]Und außerdem: zeig mit doch mal die
Code:
indexOf()
Variante, die Sprechender ist als das:
Java:
static final Pattern STREET_IN_ADDRESS = Pattern.compile("(\\w+ +) +(\\d)+");
static final int STREET_NAME =1
static final int STREET_NUMBER = 2;

public void getAddress(String input) {
Matcher streetMatcher = STREET_IN_ADDRESS.matcher(input);
if(streetMatcher.find())
  street=streetMatcher.group(STREET_NAME );
  number = streetMatcher.group(STREET_NUMBER );
}
[EDIT:]Nein, das Pattern ist nicht perfekt...

bye
TT
 
Zuletzt bearbeitet:
[ot]
Schöner Vergleich, bleiben wir dabei: Was ist angesagt, wenn jemand ein Bild aufhängen will, und ihm dann jemand empfiehlt, er solle sich erstmal eine CNC-Fräse zulegen? 😀
[/ot]
Sicher sind Patterns dann immer sehr kompakt, aber das Erstellen ist schwierig, das Nachvollziehen oft unmöglich, und dami das Ändern oft nur durch ein Neuschreiben zu erreichen....

EDIT: In diesem Fall bräuchte man (wie auch für die RegEx) eigentlich mehr Infos, aber sowas wie
string = string.substring(3, string.indexOf("__"));
dürfte man schon recht nah dran sein....
 
[ot]
EDIT: In diesem Fall bräuchte man (wie auch für die RegEx) eigentlich mehr Infos, aber sowas wie
string = string.substring(3, string.indexOf("__"));
dürfte man schon recht nah dran sein....

Danke erstma für die Zahlreichen Tips und Ideen.
Welche Infos fehlen dir denn?
Ich werd mich morgen nochma drüber machen mal schaun was dabei rauskommt.

mfg
 
Durch einigermaßen geschicktes Bauen des Patterns und unter Verwendung sogenannter Capturing Groups geht es recht leicht:
Java:
  // Diese Werte stehen vorher fest, deswegen konstant
  // Regex fürs matchen und capturen des relevanten Teils.
  // Trick sind die runden Klammern, sog. Capturing Group
  static final String regex = "%5C(\\d{4}_[A-Za-z_]*[A-Za-z]{1}).*";
  // Das vorkompilierte Pattern
  static final Pattern pattern = Pattern.compile(regex);

  /**
   * @param args
   */
  public static void main(String[] args) throws Exception {

    // Diese Werte sind dynamisch
    String eingabe = "%5C8307_Am_Goldberg_______%5CLOG-DLC.CSV";

    Matcher matcher = pattern.matcher(eingabe);
    
    matcher.matches();

mfg

    System.out.println(matcher.group(1));

    eingabe = "%5C8307_Hechtweg_______%5CLOG-DLC.CSV";

    matcher = pattern.matcher(eingabe);
    
    matcher.matches();

    System.out.println(matcher.group(1));

  }

Soweit so gut.
Als ich eine Funktion mit regex geschrieben hatte sah die so aus:
[JAVA=42]
public boolean gueltig(){
boolean gueltigkeit = Pattern.matches( "[G]\\d\\d-\\d\\d\\d-[A-Z].\\d\\d/\\d\\d\\d-\\d\\d\\d\\d\\d\\d", serienNr);
//SerienNr. Bsp.: G23-512-C.21/050-000686
return gueltigkeit;[/code]

Wenn ich anhand deines Bsp. versuche einen Rückgabewert vom Typ boolean zu bekommen funktioniert das nicht.

Soweit mein/meine Code versuche:
[JAVA=42]
public boolean casduPruefung(){
String regex = "%5C(\\d{4}_[A-Za-z_]*[A-Za-z]{1}).*";
Pattern pattern = Pattern.compile(regex);
boolean matcher = Pattern.matches(pattern, casdu);
return matcher;
// boolean neueCasdu = Pattern.matches("%5C(\\d{4}_[A-Za-z_]*[A-Za-z]{1}).*", casdu);
// System.out.println(neueCasdu);
// return neueCasdu;
}
[/code]

Type mismatch: cannot convert from boolean to Matcher. Soweit die Fehlermeldung.
Kann ich das irgendwie umschreiben um den Fehler zu umgehen?

casdu wird eingelesen und in String casdu; gespeichert.
 
Mangels der Codestelle kann ich nur oraceln, aber:
Ich vermute, dass Du den Rückgabewert von
Code:
casduPruefung()
an eine Variable vom Typ [JAPI]Matcher[/JAPI] zuweist. Das kommt hat davon, wenn man Boolenvariablen nicht
Code:
isSomething
benennt...

bye
TT
 
Zuletzt bearbeitet:
Das versteh ich nicht so richtig.
Im Endefekt liest mein Programm z.B. den String %5C8307_Am_Goldberg_______%5CLOG-DLC.CSV ein.
Diesen String speichere ich dann in einem Objekt welches wiederrum in einem Vector gespeichert ist.
Ich möchte ja nun den gespeicherten String überarbeiten sodass nur noch 8307_Am_Goldberg darin steht. Also den String sogesehen überschreiben.
 
Lies dir doch 15 Minuten mal was zu Regex und Groups durch.

Oder du arbeitest mit indexOf(...
Bisschen Eigeninitiative ist immer nötig.
 
Hab das Problem nun so wie beschrieben mit substring und indexOf gelöst.

[JAVA=42]
String ganzerString = folder;
String teilString1 = ganzerString .substring(3,7);
String teilString2 = ganzerString .substring(8, ganzerString.indexOf("__"));
le.casdu = Integer.parseInt(teilString1);
le.stationsname = teilString2;
[/code]
 

Zurück
Oben