Cómo escapar % en Cadena.Formato?


Estoy almacenando una consulta SQL en mis cadenas.xml y quiero usar String.Format para construir la cadena final en el código. La instrucción SELECT usa un like, algo así:

SELECT Field1, Field2 FROM mytable WHERE Field1 LIKE '%something%'

Para formatear que reemplace "algo" con %1 s s para que se convierta en:

SELECT Field1, Field2 FROM mytable WHERE Field1 LIKE \'%%1$s%\'

Escapo las comillas simples con la barra invertida. Sin embargo, no soy capaz de escapar a la señal de%.

¿Cómo puedo incluir una declaración like en mis cadenas?archivo xml?

Author: HugoTeixeira, 2011-02-16

4 answers

Para escapar %, tendrás que duplicarlo: %%.

 680
Author: limc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-11 13:50:32

Para complementar la solución indicada anteriormente, use:

str = str.replace("%", "%%");
 10
Author: Cavaleiro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-21 17:39:41

Este es un reemplazo de expresiones regulares más fuerte que no reemplazará %% que ya se duplicó en la entrada.

str = str.replaceAll("(?:[^%]|\\A)%(?:[^%]|\\z)", "%%");
 1
Author: Toilal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-27 06:43:49

No puedo creer que este no sea un simple problema resuelto por ahora, pero bueno, aquí está mi puñalada

(?:[^%]|^)(?:(%%)+|)(%)(?:[^%])

Para desinfectar el mensaje antes de pasarlo a String.formato, puede utilizar el siguiente

Pattern p = Pattern.compile("(?:[^%]|^)(?:(%%)+|)(%)(?:[^%])");
Matcher m1 = p.matcher(log);

StringBuffer buf = new StringBuffer();
while (m1.find())
    m1.appendReplacement(buf, log.substring(m1.start(), m1.start(2)) + "%%" + log.substring(m1.end(2), m1.end()));

// Return the sanitised message
String escapedString = m1.appendTail(buf).toString();

Tenga en cuenta que esto funciona con cualquier número de caracteres de formato, por lo que reemplazará % con %%, %%% con %%%%, %%%%% con % % % % % etc.

Dejará todos los caracteres ya escapados solos (por ejemplo,%%, % % % % etc.).)

 0
Author: Lee Winder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-17 18:50:31