1

私は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() );
}

全体としてこれで機能しますが、非常に多くのバックスラッシュがあります。これはすべてのメタクラッカーを回避しますか? それは »堅牢な« ソリューションですか?

4

1 に答える 1

6

それらを使用するよりもはるかに優れたことができます。を使用できますPatternQuote

Pattern metas = Pattern.quote("no escaped regex chars in here");

もう 1 つの方法\\は、文字クラスを使用すること[]です。そのため、[.]代わりに配置\\.しても結果は同じになり、読みやすさが得られることを願っています。

于 2013-05-04T09:20:53.933 に答える