[java] String.Format에서 %를 이스케이프 처리하는 방법은 무엇입니까?

strings.xml 파일에 SQL 쿼리를 저장하고 String.Format있으며 코드에서 최종 문자열을 작성하는 데 사용하고 싶습니다 . 이 SELECT문장은 다음과 같은 것을 사용합니다.

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

‘something’을 % 1 $ s로 바꾸는 형식을 지정하려면 다음과 같이하십시오.

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

백 슬래시로 작은 따옴표를 이스케이프 처리합니다. 그러나 % 기호를 벗어날 수 없습니다.

strings.xml 파일에 like 문을 어떻게 포함시킬 수 있습니까?



답변

탈출하려면 %두 배로 늘려야합니다 %%.


답변

앞에서 설명한 솔루션을 보완하려면 다음을 사용하십시오.

str = str.replace("%", "%%");


답변

이것은 입력에서 이미 두 배가 된 %%를 대체하지 않는 강력한 정규식 대체입니다.

str = str.replaceAll("(?:[^%]|\\A)%(?:[^%]|\\z)", "%%");


답변

다음은 이미 이스케이프 된 문자열에서 여러 %를 이스케이프 해야하는 경우 옵션입니다.

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

String.format에 전달하기 전에 메시지를 삭제하려면 다음을 사용할 수 있습니다.

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();

이것은 여러 형식의 문자와 함께 작동하므로 %를 %%로, %%%를 %%%%로, %%%%%를 %%%%%% 등으로 대체합니다.

이미 이스케이프 된 문자 만 남겨 둡니다 (예 : %%, %%%% 등).


답변