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

Java―;要在RegExp中使用的转义字符串,java,regex,Java,Regex,我对Java有点陌生,所以我不确定我是否在做他们应该做的事情。我正在开发一个程序,它更多的是为了学习Java,并且被认为是用于命令行的。其中一个特性应该是一种搜索和替换 从命令行启动程序,如下所示: java -jar pro.jar -s ${ftp://www.stuff.com} -r foo 方法:搜索准确的字符串${ftp://www.stuff.com}并将其替换为foo。我想使用Regexp进行搜索,因此必须对搜索字符串中的转义字符($,(,{,},\,…)进行转义 ${ftp:

我对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() );
}

总而言之,这是可行的,但是有太多的反斜杠。这能逃过所有元破解吗?这是一个»健壮的«解决方案吗?

你可以做一些比使用它们好得多的事情。你可以使用
模式

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

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

你可以做一些比使用它们更好的事情。你可以使用
模式

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

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

不知道您是否有这种可能性,但也许您可以确保只有一个参数接受模式,并始终作为最后一个参数提供。然后命令行的其余部分始终是您的参数,并且没有太多重复使用dodont知道您是否有这种可能性,但也许您可以确保只有一个参数接受模式,并始终作为最后一个参数提供。然后命令行的其余部分始终是您的参数,对于
模式,
,需要做的转义更少。正是为了完成此任务而设计的s也可以
Matcher.quoteReplacement
,如果您希望替换字符串被逐字处理(而不是
$1
被视为模式中捕获组的反向引用),则可以在替换字符串上使用它。谢谢!效果与预期一样!很好!+1用于
模式。quote
,它正是为完成此任务而设计的。还有
Matcher.quoteReplacement
,如果您希望按字面意思处理它,您可以在替换字符串上使用它(而不是将$1
视为模式中捕获组的反向引用)。谢谢!工作与预期一样!很好!