私はこれを達成しようとしています-文字列にパターンが含まれており、%25
その後に任意の数の英数字が続く場合、に置き換える必要があり%25
ます%
。次のコードは正しくないようです-
while (userPassword.contains("%25"+"[^A-Za-z0-9]*")) {
userPassword = userPassword.replace("%25", "%");
}
私はこれを達成しようとしています-文字列にパターンが含まれており、%25
その後に任意の数の英数字が続く場合、に置き換える必要があり%25
ます%
。次のコードは正しくないようです-
while (userPassword.contains("%25"+"[^A-Za-z0-9]*")) {
userPassword = userPassword.replace("%25", "%");
}
このメソッドString.contains()
は正規表現では機能しませんが、単純なテキストでは機能するため、実際には文字列内の正確なシーケンス「%25[^A-Za-z0-9]」を確認しています。また、^
文字クラスにないもの、つまり英数字ではないものと一致する必要があることを意味します。これは、必要なものとは逆です。
代わりに、次の方法を使用できますString.matches
。
while (userPassword.matches(".*%25[A-Za-z0-9]*"))
(ご覧のとおり、すべての正規表現を1つの文字列に入れました。コンパイラーがそれを実行してくれますが、より明確です)
例えば:
String userPassword = "%25sdflk42";
System.out.println(userPassword.contains("%25"+"[A-Za-z0-9]*"));
System.out.println(userPassword.matches(".*%25[A-Za-z0-9]*"));
これは印刷されます:
false
true
ここで注意が必要です。引数を正規表現として解釈String.contains
しません。
これを試して:
userPassword = userPassword.replaceAll("%25([a-zA-Z0-9]*)", "%$1");
後方参照を使用して、キャプチャされたパターンの一部のみを置き換えます。ドキュメントから:
ドル記号は、キャプチャされたサブシーケンスへの参照として扱われる場合があります。
while (userPassword.contains("%25"+"[^A-Za-z0-9]*"))
する必要があります
while (userPassword.contains("%25"+"[A-Za-z0-9]*"))