web-dev-qa-db-fra.com

Remplacez un point d'interrogation (?) Par (\\?)

J'essaie de définir un modèle pour faire correspondre le texte avec un point d'interrogation (?) À l'intérieur. Dans l'expression régulière, le point d'interrogation est considéré comme "une fois ou pas du tout". Puis-je remplacer le signe (?) Dans mon texte par (\\?) Pour résoudre le problème de modèle?

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.
24
Brad

Vous devez vous échapper ? comme \\? dans le expression régulière et non dans le texte.

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

Voir

Vous pouvez également utiliser la méthode quote de la classe Pattern pour citer les méta-caractères regex, de cette façon vous = ne vous inquiétez pas de les citer:

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

Voir

45
codaddict

La bonne façon d'échapper tout texte pour l'expression régulière dans Java est d'utiliser:

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

Ensuite, vous pouvez utiliser le quotedText dans le cadre de l'expression régulière.
Par exemple, votre code devrait ressembler à:

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