将问号 (?) 替换为 (\\?)

2022-09-01 14:04:31

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

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.

答案 1

您需要像在正则表达式中一样转义,而不是在文本中转义?\\?

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

看到它

您还可以利用类的方法引用正则表达式元字符,这样就不必担心引用它们:quotePattern

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

看到它


答案 2

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

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

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

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." );