2016-05-31 9 views
1

Ich habe dieses Code-Snippet einer Code-Basis, die ich pflegen soll.ersetzen Regex-String mit Parameter/Token

String number = "1"; 
String value = "test"; 
String output = ""; 

output = value.replaceAll("\\Q{#}", number); 

Der Wert von output Aufenthalten als „Test“ und ich kann nur raten, was dieser Code tun soll: Der Wert der number sollte angefügt werden, was auch immer in Wert ist. Vielleicht etwas in der Art: test1 oder ersetzen Sie den Wert vollständig durch die Zahl.

Ich fand heraus, dass \\Q ist die Regex-Option, alles bis \\E zu zitieren, aber es gibt keine \\E. Jedenfalls tut es gar nichts und ich frage mich, ob ich etwas beaufsichtige?

+2

Die Regex entspricht nur einem Literal '{#}'. Wenn Ihr 'Wert' 'test {#}' ist, wird '{#}' durch die Zahl ersetzt. Siehe [diese Demo] (https://ideone.com/Zizftn). '\\ E' hört einfach auf zu zitieren, wenn es fehlt, wird das ganze Muster zitiert, das ist alles. –

+0

AFAIK '#' ist kein Sonderzeichen in Regex. Wenn man also annimmt, dass Java Regex '\ Q' versteht, würde es nach der literalen Zeichenfolge' {#} 'suchen, die in' value' nicht vorhanden ist. Abgesehen davon ist Ihre Vermutung falsch: 'replaceAll' ersetzt die Übereinstimmung durch' number' - wenn Sie etwas am Ende anhängen möchten, müssen Sie das Ende der Eingabe, z. benutze einfach den Ausdruck '$'. – Thomas

+0

Ich kann keine Frage in der Post sehen. Wonach suchen Sie? –

Antwort

1

Ihr Regex entspricht nur einem Literal {#}. Es ist richtig, dass nach \Q das Muster als buchstäbliche Symbole betrachtet wird (alle Symbole nach \Q erhalten "quoted" oder "escaped"), und \E stoppt dieses Entweichen/Zitieren, und wenn es fehlt, wird das ganze Muster in Anführungszeichen gesetzt /entkam.

Wenn Ihr Wert Variable test{#} Wert hält, wird die {#} mit der Nummer ersetzt bekommen.

Siehe this demo:

String number = "1"; 
String value = "test{#}"; 
String output = ""; 
output = value.replaceAll("\\Q{#}", number); 
System.out.println(output); // => test1 

Beachten Sie, dass ohne \Q, Ihre regex ({#}) würde einen java.util.regex.PatternSyntaxException: Illegal repetition Fehler werfen, weil Java Regex-Engine nicht "smart" genug ist, um die Klammern (PCRE, JS, .NET eindeutig zu machen kann leicht erraten, da es keine Zahl im Inneren gibt, ist es kein begrenzender/gebundener Quantifizierer).