Reguläre Ausdrücke

TJava

Bekanntes Mitglied
Hallo ich durchsuche eine Datei nach einem Ausdruck.
Die Zeile soll diesen Asudruck enthalten
*.sql* würde ich in Windows schreiben

dann wenn diese Zeile gefunden ist soll er den String so trennen das

\namederdatei.sql herausgefiltert wird und in eine Variable gespeichert wird.

Java:
while (aktline != null) {
					try {
						inFile = new BufferedReader(new FileReader(scriptFiles[i]));
						aktline = inFile.readLine();
						if(aktline.matches("???"))
							
						String gefundeneDatei = aktline.???() STRING zerpflücker}}

Danke
 
Das geht leider nicht ich kenne ja den Namen der Datei nicht, der ist immer anders.
Das ist klar, sonst würdest Du ja nicht danach suchen ;-)
Aber Du kannst ja mit indexOf(".sql") - ohne RegEx - suchen und dann z.B. mit charAt(int i) rückwärts nach dem Dateitrenner suchen und Dir somit die notwendigen Indizes ermitteln, um dann mittels substring den gewünschten Textteil rauszulösen.

Ähnliche Problemstellungen gab es ja vor Java 1.4 auch schon ;-)

Falls Du mit Regex arbeiten willst Punkt und Backslash sind Metazeichen und müssen in dem Fall maskiert werden. Da der Backslash auch in Java ein Metazeichen ist musst Du hier die Maskierung auch noch maskieren.
 
Wie schauen die bisherigen Versuche denn aus?

Einfacher ist das Problem erst einmal separat anzugehen mittels Teststring ohne Dateieinlesen usw.

Beginnen könnte man mal so:
Java:
String test = "asqlsf\\sdgsdf.sqlsdfsqldf";
Pattern pattern = Pattern.compile("sql");
Matcher matcher = pattern.matcher(test);
while(matcher.find())
	System.out.println(matcher.group(0));
 
OK super das klappt und wie extrahiere ich nur einen bestimmten teil des String?

also name.sql und schmeiße den rest weg?
 
Java:
if (aktline.matches(".*\\.sf0.*")) {
							
							Pattern pat = Pattern.compile("\\.sf0");
							Matcher mat = pat.matcher(aktline);
							if(mat.find()){
							   System.out.println(mat.group(0));
							}

Mmhhh checke es nicht. also ich suche den String der zwischen \ und " steht und mit .sfo endet
k
 
Probiere es doch wie in meinen Vorschlag aus und baue das Pattern Stück für Stück aus.

Wie gesagt sind \ und . bei Regulären Ausdrücken Metazeichen. Der Punkt steht für ein beliebiges Zeichen und der Backslash dient zur Maskierung.

Wenn man also
Code:
\\.sf0
im Java Code als Pattern verwendet.
--> Steht es für den RegExp
Code:
\.sf0
(da der Backslash auch in Java ein Metazeichen ist)
--> Das heisst es wird nach der Zeichenkette
Code:
.sf0
gesucht.

Wie gesagt indexOf, charAt und substring sind einfacher anzuwenden als RegExp ;-)
 
Ja das merke ich auch :-D aber ich will es anwenden, sitze nun schon seit 8 uhr heute morgen am pc und programmiere. Mache morgen weiter muss jetzt noch ne Präsentation zaubern:rtfm:

Aber morgen werde ich weiter nerven
 
Das Problem ist, dass
Code:
.matches(regex)
nur funktioniert, wenn der ganze String mit dem regulären Ausdruck beschrieben wird.

"Michael..." hat oben beschrieben, wie man es anders machen kann.
 
Guten Morgen liebe Javafreunde,

also ich suche _SF0_Datei_Einspielen($rootDir & "\Hilfsdateien\SF0-Dateien\datei1.sf0", 1)

mit Patternmatching
Java:
Pattern pat = Pattern.compile(".+sf0");

kann ich bisher das ganze so Filtern das

Java:
_SF0_Datei_Einspielen($rootDir & "\Hilfsdateien\SF0-Dateien\datei1.sf0

rauskommt.

Wie sage ich nun das ich ab dem / suche ==> datei.sfo??
 
Vielleicht hilft dir folgendes zur Visualisierung des Problems?
Um es für dich lösen zu können, weiß ich zu wenig.

Java:
package forumProblems;

import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class RegularExpressionProblem {

    public static void main(String[] args) {
        String input = "foo bar _SF0_Datei_Einspielen"
            + "($rootDir & \"\\Hilfsdateien\\"
            + "SF0-Dateien\\datei1.sf0\", 1) baz";
        System.out.println("Eingabe: [" + input + "]");

        Pattern pattern = Pattern.compile(".+sf0");
        Matcher matcher = pattern.matcher(input);

        while (matcher.find()) {
            int start = matcher.start();
            int end   = matcher.end();
            System.out.println("Vor dem Fund : [" + input.substring(0, start) + "]");
            System.out.println("Fund         : [" + input.substring(start, end) + "]");
            System.out.println("Nach dem Fund: [" + input.substring(end) + "]");
        }
    }

}

Ausgabe:

Code:
Eingabe: [foo bar _SF0_Datei_Einspielen($rootDir & "\Hilfsdateien\SF0-Dateien\datei1.sf0", 1) baz]
Vor dem Fund : []
Fund         : [foo bar _SF0_Datei_Einspielen($rootDir & "\Hilfsdateien\SF0-Dateien\datei1.sf0]
Nach dem Fund: [", 1) baz]
 
Zuletzt bearbeitet:
Was ist mit dem hier?
Java:
		String s= "_SF0_Datei_Einspielen($rootDir & \"\\Hilfsdateien\\SF0-Dateien\\datei1.sf0\", 1)";
		String pattern = "\\\\([^\\\\]*?)\\.sf0";
		
		Pattern p = Pattern.compile(pattern);
		Matcher m = p.matcher(s);
		if (m.find()){
			System.out.println(m.group(1));
		}else{
			System.out.println("NOT FOUND");
		}
 
Sehen denn die relevanten Zeilen immer so aus?
Code:
blabla\blabla\blabla\blabla\blabla\gesuchteDatei.sf0
Dann ist Regex m.M. nach hier völlig überflüssig, wenn nicht sogar fehl am Platz.
Einfach die Zeilenstrings mit endsWith(".sf0") prüfen, ob sie relevante Informationen enthalten.
Wenn ja mittels substring(int i) und lastIndexOf("\\") den Dateinamen heraustrennen.
Lässt sich auf zwei Codezeilen reduzieren.
 
Es sieht halt meist so aus
Java:
_SF0_Datei_Einspielen($rootDir & "\Hilfsdateien\SF0-Dateien\datei1.sf0", 1)
 
hehe ich habe es jetzt mit Wenn ja mittels substring(int i) und lastIndexOf("\\") gelöst

Java:
System.out.println(aktline);
							System.out.println(aktline.lastIndexOf("\\"));
							System.out.println(aktline.lastIndexOf("\""));
							System.out.println(aktline.substring(aktline.lastIndexOf("\\")+1, aktline.lastIndexOf("\"")));

Ich hoffe das geht nun bei allen anwendungungsfällen
 
Zuletzt bearbeitet:

Zurück
Oben