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?
4 answers
Para escapar %
, tendrás que duplicarlo: %%
.
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("%", "%%");
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)", "%%");
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.).)
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