java - resource - strings xml
¿Cómo escapar% en String.Format? (4)
Estoy almacenando una consulta SQL en mi archivo strings.xml y quiero usar String.Format
para construir la cadena final en código. La instrucción SELECT
usa un like, algo como esto:
SELECT Field1, Field2 FROM mytable WHERE Field1 LIKE ''%something%''
Con el fin de dar formato, sustituyo ''algo'' con% 1 $ s para que se convierta en:
SELECT Field1, Field2 FROM mytable WHERE Field1 LIKE /'%%1$s%/'
Me escapo de las comillas simples con la barra invertida. Sin embargo no puedo escapar del signo%.
¿Cómo puedo incluir una declaración similar en mi archivo strings.xml?
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)", "%%");
No puedo creer que este no sea un problema resuelto por ahora, pero oye, aquí está mi intento.
(?:[^%]|^)(?:(%%)+|)(%)(?:[^%])
Para sanear el mensaje antes de pasarlo a String.format, puede usar lo 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á solos los caracteres ya escapados (por ejemplo, %%, %%%% etc.)
Para complementar la solución mencionada anteriormente, use:
str = str.replace("%", "%%");
Para escapar %
, necesitarás duplicarlo: %%
.