2013-05-14 3 views
-4

문자열의 특정 작은 따옴표를 % 27 (으)로 대체하려고합니다. 작은 따옴표는 다음 조건을 충족해야합니다.정규식을 사용하여 패턴 일치 및 바꾸기

  1. 작은 따옴표는 줄의 시작에 없습니다.
  2. 작은 따옴표는 줄 끝 부분에 없습니다.
  3. 작은 따옴표 뒤에는 쉼표가 없습니다.
  4. 작은 따옴표 '은', 'b'c은'나는이 작업을 수행하려면 어떻게 'A', 'B의 %의 27C'

    될 것 쉼표 예를 들어

다음되지 않는다 자바?

+2

지금까지 무엇을 했습니까? 우리가 작업하고 통찰력을 제공 할 수있는 출발점이 있습니까? –

답변

3

이유를 무시하면 정규식을 선택하는 이유이 작업을 수행하려면 다음과 같은 정규 표현식을 사용할 수 있습니다 이 첫 번째 솔루션 은 입력에 새로운 라인 문자이 없다고 가정합니다. 라인의 시작과 끝이 전체 라인의 시작과 끝을 효과적으로 시작합니다. ~. 가정이 적용되지 않는 경우, 즉 입력에 줄 바꿈 문자가 포함 된 경우 두 번째 해결 방법을 사용하십시오.


또는 더 긴 버전 (이 은 입력 문자열에 새로운 라인 문자도지지 않습니다) : a bug in Java 1.5 and 1.4.2 that affects look-behind with alternation 있기 때문에
"(?<!^)(?<!,)'(?!$|,)" 

는 나는이 모양 비하인드을 분리했다. Java 1.6 이상 만 지원하려는 경우 (?<!^|,)과 같이 2 개의 look-behind를 함께 사용할 수 있습니다. 당신이 라인의 시작 대신 문자열시작을 원하는 경우에

, 대신 기본 시작으로, ^$는 라인의 시작과 끝을 일치하게 MULTILINE 플래그 (?m)을 활성화 할 필요 문자열의 끝. 예 :

+0

첫 번째 표현식이 무효화되는 것을 의미합니까? '? Floris

+2

@Floris : 아니요. 이전 문자가 있으므로 (즉, 문자열의 시작이 아님) 그리고 앞의 문자는','가 아니다. – nhahtdh

+1

OK 나는 긍정적 인 lookbehind가 "문자 없음"("start of line"은 쉼표가 아니므로 일치한다고 생각하지 않는다)을 인식하지 못했다고 생각한다. 고마워! – Floris

1

정규식 당신을 위해 일하는 것이을 부정적 예측을 사용하고 lookbehind :

"(?<=[^,])'(?=[^,])" 

:

String repl = "'a','b'c'".replaceAll("(?<!(^|,))'(?!(,|$))", "%27"); 
// 'a','b%27c' 
+0

정규 표현식을 생성/컴파일하는 라인을 깨뜨리는 것이 고려 될 수도 있고, 정규식을 컴파일하는 라인을 만들 수도 있습니다. 적용하지 않는 경우 가독성을 위해 ... – Floris

관련 문제