私はJavaに少し慣れていないので、やるべきことをやっているかどうかはわかりません。私はプログラムを開発しています。これは、Java の目的を学習するためのものであり、コマンドラインでの使用を想定しています。機能の 1 つは、一種の検索と置換である必要があります。
次のようにコマンドラインからプログラムを起動します。
java -jar pro.jar -s ${ftp://www.stuff.com} -r foo
意味: 正確な String を検索し、${ftp://www.stuff.com}
それを に置き換えfoo
ます。正規表現で検索したいので、検索文字列のエスケープ文字 ($、(、{、}、\、…) をエスケープする必要があります。
${ftp://www.stuff.com} --> \$\{ftp:\/\/www\.stuff\.com\}
したがって、私はその関数を書きました:
private static Pattern getSearchPattern()
{
String searchArg = cli.getOptionValue( "s" ).trim();
StringBuffer escapedSearch = new StringBuffer();
Pattern metas = Pattern.compile( "([\\.\\?\\*\\{\\}\\[\\]\\(\\)\\^\\$\\+\\|\\\\])" );
Matcher metaMatcher = metas.matcher( searchArg );
while( metaMatcher.find() )
{
metaMatcher.appendReplacement(escapedSearch, "\\\\\\\\$0" );
}
metaMatcher.appendTail( escapedSearch );
return Pattern.compile( escapedSearch.toString() );
}
全体としてこれで機能しますが、非常に多くのバックスラッシュがあります。これはすべてのメタクラッカーを回避しますか? それは »堅牢な« ソリューションですか?