2016-05-31 5 views
1

私はこのコードを、私が維持しなければならないコードスニペットを持っています。 「テスト」として正規表現の文字列をパラメータ/トークンに置き換えてください。

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

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

output滞在の価値と私はこのコードが行うことになっているものを推測することができます:numberの値が値であるものは何でもに追加する必要があります。たぶんこのような何か:test1または値を完全に番号で置き換えます。

\\Qは、\\Eまですべてを引用する正規表現オプションですが、\\Eはありません。とにかく何もしていないし、何かを監督すればいいのだろうか?

+2

正規表現は単に '{#}'と一致します。あなたの 'value'が' test {#} 'なら、' {#} 'はその番号に置き換えられます。 [このデモ](https://ideone.com/Zizftn)を参照してください。 '\\ E'はクォーテーションを止めるだけです。見つからなければ、パターン全体が引用されます。それだけです。 –

+0

AFAIK '#'は正規表現では特殊文字ではないので、Java正規表現が '\ Q'を理解していると仮定すると' value'には存在しないリテラル文字列 '{#} 'が検索されます。あなたの推測は間違っています: 'replaceAll'は' match 'を 'number'に置き換えます。最後に何かを追加したい場合は、入力の最後に一致する必要があります。 '$'という式を使うだけです。 – Thomas

+0

投稿に質問が表示されません。何を探していますか? –

答えて

1

あなたの正規表現は、ちょうどリテラルの{#}と一致します。 \Qのパターンには、リテラルシンボル(\Qの後のすべてのシンボルが "quoted"または "escaped"となる)とみなされ、\Eがこのエスケープ/クォートを停止し、欠落している場合はパターン全体が引用されます/エスケープ。

の値がの場合、test{#}の値を保持する場合は、{#}がその数値に置き換えられます。

this demoを参照してください:Javaの正規表現エンジンは、.NET、PCRE、JS(括弧を明確にするのに十分な "スマート" ではありませんので\Qせずに、あなたの正規表現({#})はjava.util.regex.PatternSyntaxException: Illegal repetitionエラーをスローすることを

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

注意内部に数字がないので簡単に推測することができますが、これは限定的/限定的な限定子ではありません)。

関連する問題