我对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?这是一个“强大的”解决方案吗?
答案 0 :(得分:6)
你可以比使用它们做得更好。您可以使用PatternQuote
。
Pattern metas = Pattern.quote("no escaped regex chars in here");
摆脱\\
的另一种方法是使用字符类[]
。因此,如果您放置[.]
而不是\\.
,结果将是相同的,并希望您获得一些可读性。