1

我对Java有点陌生,所以我不确定我是否正在做他们应该做的事情。我正在开发一个程序,该程序更多地用于学习 Java,并且被认为是命令行使用。其中一个功能应该是一种搜索替换。

从命令行启动程序,如下所示:

java -jar pro.jar -s ${ftp://www.stuff.com} -r foo

意思是:搜索确切的字符串${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() );
}

总而言之,这项工作,但有这么多的反斜杠。这是否逃脱了所有的metachrackters?这是一个“稳健”的解决方案吗?

4

1 回答 1

6

你可以做一些比使用它们更好的事情。您可以使用PatternQuote.

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

另一种摆脱的方法\\是使用字符类[]。所以如果你把[.]而不是\\.结果会是一样的,希望你能得到一些可读性。

于 2013-05-04T09:20:53.933 回答