Bug bei regulären Ausdrücken?

Status
Nicht offen für weitere Antworten.
F

Frank

Gast
Hallo,

der folgende reguläre Ausdruck tut nicht das, was ich erwarte:

Code:
public class regexpjdk {
    public static void main(String[] args) {
    String source = "123";
    System.out.println(source.replaceAll("(.*)","$1x$1"));  
    }
}


Als Ausgabe erhalte ich "123x123x" statt "123x123", wie ich es
richtig fände. Woher kommt das abschliessende 'x'? Mit dem
Jakarta-Oro Package erhalte ich das erwartete Ergebnis "123x123":

Code:
public static void main(String[] args) {
    String s = "123";
    Perl5Util p = new Perl5Util();
    System.out.println(p.substitute("s|(.*)|$1x$1|g", s));
}

Ist das ein Bug von 'replaceAll' ?

Dank im voraus,

Frank
 

0xdeadbeef

Top Contributor
Ich würde mal annehmen, daß replaceAll anscheinend iterativ arbeitet. Sprich beim zweiten $1 wird anscheinend der Ausdruck nochmals ausgewertet. Da beim zweiten $1 der String bereits "123x" ist, wird dann auch eine "123x" eingefügt.
Hast Du mal ReplaceFirst probiert? Eigentlich willst Du ja nicht n-Mal ersetzen, sondern nur ein einziges Mal.
 
G

Guest

Gast
Code:
String source = ""; // Leerer String
System.out.println(source.replaceAll("(.*)","$1x$1"));
System.out.println(source.matches("(.*)"));
System.out.println(source.replaceAll("(.+)","$1x$1"));
System.out.println(source.matches("(.+)"));
Alles klar ;)
 

abollm

Top Contributor
Nicht sehr schön, aber funktioniert:
Code:
		String source = "123";
		//System.out.println(source.replaceAll("(.*)", "$1x$1"));
		
		Pattern numPattern = Pattern.compile(source); 
		Matcher myMatch = numPattern.matcher(source);
		StringBuffer myBuffer = new StringBuffer();
		StringBuffer replacement = new StringBuffer().append("x");
				
		while (myMatch.find()) {
			replacement.replace(1,1,myMatch.group());
			myMatch.appendReplacement(myBuffer, replacement.toString());
		}
		System.out.print(source);		
		myMatch.appendTail(myBuffer);
		System.out.println(myBuffer.toString());
 
G

Guest

Gast
Oder gleich
Code:
System.out.println(new StringBuffer(source).append('x').append(source));
:bae:
 

Bleiglanz

Gesperrter Benutzer
Code:
System.out.println("123".replaceAll("(.*)","$1x$1y$1z"));
liefert
Code:
123x123y123zxyz 
            ^^^
es liegt offenbar am pattern (.*), das nach dem ersten replace nochmal aufgerufen wird; dann aber am ende des Strings "123" (also nach dem dreier) wo es noch einmal auf den "" matcht (dann also ist $1="" und so weiter)

System.out.println("123".replaceAll("(^.*)","$1X$1Y$1Z"));

machts jeden falls richtig
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben