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


445

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 문을 어떻게 포함시킬 수 있습니까?


% s를 올바르게 이스케이프하는 것을 잊지 마십시오.
Seva Alekseyev


그들은 걱정하지 않고 자신의 데이터베이스에 주입 할 것입니다.;)
Matthew

7
데이터베이스가 자신의 데이터베이스 인 경우에도 실수로 나쁜 일을하는 쿼리를 작성할 수 있습니다. 또는 컴파일되지 않은 쿼리를 작성하십시오. 쿼리를 준비하는 것은 좋은 습관입니다.
Rauni Lillemets

대신 String.format()사용 MessageFormat()하는 것보다 느리지 만 .
ccpizza

답변:



14

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

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

1
이것은 이미 두 배인 %를 대체합니다. 다른 답변을 읽으십시오.
Toilal

1
@Toilal 왜 누군가 이미 탈출 한 것을 탈출하겠습니까? 그리고 그가 원한다면 실제로 그렇게하지 않겠습니까? 아마 그는 두 개의 % 기호를 가지려고했기 때문에 올바른 탈출 형식은 '%%%%'일 것입니다
David Balažic

2

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

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

-3

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

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

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

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

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


8
"지금까지 이것이 단순한 해결 된 문제가 아니라고 믿을 수 없다"<< 당신은 간단한 해결책이 받아 들여진 후 6 년 동안 대답했다.
AjahnCharles
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.