用(\\?)替换问号(?)

时间:2010-12-29 14:03:13

标签: java regex replace escaping

我正在尝试定义一个匹配文本的模式,并在其中加上问号(?)。在正则表达式中,问号被认为是“一次或根本没有”。 我可以用(\\?)替换文本中的(?)符号来修复模式问题吗?

String text = "aaa aspx?pubid=222 zzz";
Pattern p = Pattern.compile( "aspx?pubid=222" );
Matcher m = p.matcher( text );

if ( m.find() )
 System.out.print( "Found it." );
else
 System.out.print( "Didn't find it." );  // Always prints.

2 个答案:

答案 0 :(得分:41)

您需要在{strong> 正则表达式中将?转换为\\?,而不是在文本 中转义。

Pattern p = Pattern.compile( "aspx\\?pubid=222" );

See it

您还可以使用quote类的Pattern方法引用正则表达式元字符,这样 不需要不得不担心引用它们:

Pattern p = Pattern.compile(Pattern.quote("aspx?pubid=222"));

See it

答案 1 :(得分:3)

在java中转义正则表达式的任何文本的正确方法是使用:

String quotedText = Pattern.quote("any text goes here !?@ #593 ++ { [");

然后您可以使用 quotedText 作为正则表达式的一部分 例如,您的代码应如下所示:

String text = "aaa aspx?pubid=222 zzz";
String quotedText = Pattern.quote( "aspx?pubid=222" );
Pattern p = Pattern.compile( quotedText );
Matcher m = p.matcher( text );

if ( m.find() )
    System.out.print( "Found it." ); // This gets printed
else
    System.out.print( "Didn't find it." );