要在RegExp中使用的Java转义字符串

时间:2013-05-04 09:16:03

标签: java regex

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

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

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

表示:搜索确切的字符串${ftp://www.stuff.com}并将其替换为foo。我想用Regexp进行搜索,所以我必须在搜索字符串中转义转义字符($,(,{,},\,...)。

${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?这是一个“强大的”解决方案吗?

1 个答案:

答案 0 :(得分:6)

你可以比使用它们做得更好。您可以使用PatternQuote

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

摆脱\\的另一种方法是使用字符类[]。因此,如果您放置[.]而不是\\.,结果将是相同的,并希望您获得一些可读性。