2010-12-29 37 views
21

Estoy tratando de definir un patrón para que coincida con el texto con un signo de interrogación (?) Dentro de él. En la expresión regular, el signo de interrogación se considera "una vez o nada". Entonces, ¿puedo reemplazar el signo (?) En mi texto con (\\?) Para arreglar el problema del patrón?Reemplazar un signo de interrogación (?) Con (\?)

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

¿Usted intentó reemplazar el ''?? Parece más simple que hacer la pregunta aquí. – Carl

Respuesta

40

tiene que escapar ? como \\? en la expresión regular y no en el texto.

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

See it

También puede hacer uso de quote método de la clase Pattern citar los meta-caracteres de expresiones regulares, de esta manera que no necesita tener que preocuparse de citarlos:

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

See it

+0

Sí, lo siento, eso es lo que quise decir ... ¿Necesito reemplazar el? con \\? en la expresión regular. – Brad

+0

@Downvoter: Me encantaría saber qué es lo que piensas que es incorrecto. – codaddict

+0

+1 para 'Pattern.quote'. Ese es el camino a seguir. – wchargin

3

La forma correcta para escapar de cualquier texto para expresiones regulares en Java es utilizar:

String quotedText = Pattern.quote("any text goes here [email protected] #593 ++ { ["); 

continuación, puede utilizar la quotedText como parte de la expresión regular.
Por ejemplo, usted código debería ser similar:

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

No sé si diría que es la "forma correcta". ¿Qué pasa si su patrón es (por el bien de la discusión) '? * \ + *?' donde los caracteres impares son literales. ¿Prefiere ver "\\? * \\\\ + \\ *?" o [[Pattern.quote ("?") + "*" + Pattern.quote ("\\") + "+" + Pattern.quote ("*") + "?" ]] en tu código? Dicho esto, estaría de acuerdo en que el uso de Pattern.quote podría describirse fácilmente como la forma menos propensa a errores para escaparse de texto para una expresión regular. –

+0

Si se trata de algún tipo de cadena que puede cambiar, definitivamente usaría Pattern.quote(), si eso fuera parte de la expresión externa o de una sola cita solo me escaparía. En la pregunta original, Brad necesita citar una cadena, no un personaje. –

Cuestiones relacionadas