Regex Ausdrücke im Array - Wieso werden sie nicht erkannt?

javaKueken

Mitglied
Ich habe den folgenden Code geschrieben:

Java:
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPathExpressionException;
import org.xml.sax.SAXException;

public class MatcherClass
{
	public static void main(String args[]) throws XPathExpressionException,
			ParserConfigurationException, SAXException, IOException
	{
		String[] regexes = new XMLwork().xmlRenameOld();
		String[] replacement = new XMLwork().xmlRenameNew();
		String candidateString = "darf ich an dieser Stelle nicht nennen";

		Pattern p = Pattern.compile(regexes[0]);
		Matcher matcher = p.matcher(candidateString);
		String tmp = matcher.replaceAll(replacement[0]);
		System.out.println(candidateString + "\n" + "replace: " + tmp);

	}
}

Es gibt zwei Arrays in den sich jeweils die Regex befinden und im anderen Array der Replace-Ausdruck.
z.B.
In
Java:
regexes[0]="(\\w{1,})-(\\d{1,})-(\\w{1,})-(\\d{1,})-(\\w{1,})-(\\d{1,})-(\\w{1,}\\d{1,})--(\\d{1,})-(\\d{1,})_(\\w{1,})(.\\w{1,})"
gespeichert und in
Java:
replacement[0]="$1+$5+20$2+$4+$10$11"
gespeichert. Übrigens seht ihr in
Java:
regexes[0]
jedesmal ein Doppel-Backslash, was richtig ist, da es sich um Java handelt.

Wenn ich die Ausdrücke so schreibe:
Java:
Pattern p = Pattern.compile("(\\w{1,})-(\\d{1,})-(\\w{1,})-(\\d{1,})-(\\w{1,})-(\\d{1,})-(\\w{1,}\\d{1,})--(\\d{1,})-(\\d{1,})_(\\w{1,})(.\\w{1,})");
und
Java:
String tmp = matcher.replaceAll("$1+$5+20$2+$4+$10$11");

Funktioniert alles wunderbar.
Wenn ich es so wie oben programmiere, quasi den Wert im Array per Index auslese, funktioniert es nicht.
Warum nicht?
Habt ihr eine Idee?

PS: Den candidateString darf ich hier nicht nennen. Aber die Expressions passen und sind korrekt um den original candidateString zu erkennen.
 
Funktioniert alles wunderbar.
Wenn ich es so wie oben programmiere, quasi den Wert im Array per Index auslese, funktioniert es nicht.
Warum nicht?
Habt ihr eine Idee?
Vielleicht weil die Ausdrücke im Array falsch drin stehen? Einfach mal den Regulären Ausdruck für beide Varianten per System.out. ausgeben und vergleichen

Hab den RegEx nur überflogen, aber da steckt sicherlich noch Potential drin. z.B. statt
Code:
{1,}
kann man auch einfach
Code:
+
schreiben, die Gruppen schein mir auch überflüssig.

String bietet im übrigen selbst eine Methode replaceAll(...)
 
Vielleicht weil die Ausdrücke im Array falsch drin stehen? Einfach mal den Regulären Ausdruck für beide Varianten per System.out. ausgeben und vergleichen

Hab den RegEx nur überflogen, aber da steckt sicherlich noch Potential drin. z.B. statt
Code:
{1,}
kann man auch einfach
Code:
+
schreiben, die Gruppen schein mir auch überflüssig.

String bietet im übrigen selbst eine Methode replaceAll(...)

Die Sache ist die. ich lese alle Ausdrücke aus einer XML Datei aus und speichere sie in den Arrays. Die Ausdrücke sind vielleicht nicht optimal aber sie funktionieren definitiv. Getestet mit System.out.print und regex online tools usw.

der Code beispielsweise funktioniert wuderbar:
Java:
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPathExpressionException;
import org.xml.sax.SAXException;

public class MatcherClass
{
	public static void main(String args[]) throws XPathExpressionException,
			ParserConfigurationException, SAXException, IOException
	{
//		String[] regexes = new XMLwork().xmlRenameOld();
		 String[] regexes = {
		 "(\\w{1,})-(\\d{1,})-(\\w{1,})-(\\d{1,})-(\\w{1,})-(\\d{1,})-(\\w{1,}\\d{1,})--(\\d{1,})-(\\d{1,})_(\\w{1,})(.\\w{1,})",
		 "(\\w{1,})-(\\d{1,})-(\\w{1,})-(\\d{1,})-(\\w{1,})-(\\d{1,})-(\\w{1,}\\s\\w{1,}\\s\\w{1,})--(\\d{1,})_(\\w{1,})(.\\w{1,})"
		 };
		String[] replacement = new XMLwork().xmlRenameNew();
		// String[] replacement = {
		// "$1+$5+20$2+$4+$10$11", "$1+$5+20$2+$8+$9$10" };
		String candidateString = "BLA-120829-Seite-1-BLABLA-1-Seite1--001-001_farbe.tif";

//		 System.out.println(regexes[0]);
		Pattern p = Pattern.compile(regexes[0]);
		Matcher matcher = p.matcher(candidateString);
		String tmp = matcher.replaceAll(replacement[0]);
		System.out.println(candidateString + "\n" + "replace: " + tmp);

	}
}

und da habe ich nur das array regexes selber geschrieben in die klasse und nicht aus der xml gelesen. Das Array String[] replacement lese ich aber aus der XML aus. Das ist doch komisch oder?
 
"BLA-120829-Seite-1-BLABLA-1-Seite1--001-001_farbe.tif"

Regex:

"BLA\\-120829\\-Seite\\-1\\-BLABLA\\-1\\-Seite1\\-\\-001\\-001_farbe\\.tif"

bzw.

"\\w+\\-\\d+\\-Seite\\-\\d+\\-\\w+\\-\\d+\\-[\\w\\d]+\\-\\-\\d+\\-.+"

bzw.

"(\\w+)\\-(\\d+)\\-Seite\\-(\\d+)\\-(\\w+)\\-(\\d+)\\-([\\w\\d]+)\\-\\-(\\d+)\\-(.+)"

matcht bei mir:

Java:
        Matcher m = Pattern
                .compile("(\\w+)\\-(\\d+)\\-Seite\\-(\\d+)\\-(\\w+)\\-(\\d+)\\-([\\w\\d]+)\\-\\-(\\d+)\\-(.+)")
                .matcher("BLA-120829-Seite-1-BLABLA-1-Seite1--001-001_farbe.tif");
        m.find();
        for (int i = 0; i <= m.groupCount(); i++) {
            System.out.println(m.group(i));
        }

Code:
BLA-120829-Seite-1-BLABLA-1-Seite1--001-001_farbe.tif
BLA
120829
1
BLABLA
1
Seite1
001
001_farbe.tif

Vielleicht hilft das ja

[EDIT]([\\w\\d]+)\\-

könnte man auch ersetzen in

([^-]+)\\-

. Würde mir auch beide reguläre Ausdrücke einmal mit sout ausgeben lassen und vergleichen! Diese sollten identisch sein[/EDIT]
 
Zuletzt bearbeitet von einem Moderator:

Zurück
Oben