2009-09-07 3 views
1

나는 이것이 매우 빠르고 간단한 대답을 가지기를 바라고있다. regular-expressions.info을 사용하여 URL 인코딩 된 ISO-8859-1 파운드 기호 ("% A3")를 URL 인코딩 된 UTF-8 파운드 기호 ("% C2 % A3")로 바꿔주는 올바른 정규식을 얻으려고합니다. .자바 정규식 Lookbehind 실패

다른 말로하면 % A3에 이미 % C2가 접두어가 아닌 경우 % A3 %로 바꾸고 싶습니다.

Regular Expression: (?!(\%C2))\%A3 
Replace With:  %C2%A3 

을하지만 그렇지 않습니다 나는 이유를 알아낼 수 없습니다 :

그래서 나는 다음과 같은 작업 것이라고 생각했을 것이다!

필자의 구문이 약간 잘못되었다고 가정하지만, 알아낼 수는 없습니다. 어떤 아이디어?

FYI - 다음 내용이 효과가 있으며 그동안 해결 방법으로 사용했음을 알고 있지만 실제로 이전 버전이 작동하지 않는 이유를 알고 싶습니다.

Regular Expression: ([^\%C2])\%A3 
Replace With:  $1%C2%A3 

TIA!

+0

ISO 8859-1을 UTF-8로 변환하려면 인코딩 변환기가 필요하다고 생각합니다. – Gumbo

답변

4

((%C2)?%A3)%C2%A3으로 바꾸지 않고 접두사를 선택 사항으로 사용하면 어떨까요? 이미 올바른 경우에도 텍스트를 "대체"한다는 의미이지만 성능 문제는 예측하지 않습니다.

+0

훌륭한 사운드 - 왜 그런 생각을하지 않았는지 - 감사합니다! :) 그것은 본질적으로 또 다른 해결 방법이기 때문에 답변을 받아들이지 않습니다 (문제의 요점은 내 lookbehind가 작동하지 않는 이유를 찾는 것이었지만) 감사합니다! – FrostbiteXIII

+0

무시하십시오 - 받아 들인 대답 - 많은 감사합니다! :) – FrostbiteXIII

+0

아주 좋은 +1. '(? : (? : % C2)? % A3)'를 사용할 수 있습니다. 왜냐하면이 경우 역 참조가 실제로 필요하지 않기 때문입니다. – Tomalak

4

불행히도 (?!) 구문은 부정적 예측입니다. JavaScript는 부정적인 lookbehind를 지원하지 않습니다.

당신이 할 수있는 일은 대체로 어쨌든 진행하고 % C2 % C2 % A3 문자열로 끝나지 만 두 번째 패스에서 원하는 % C2 % A3으로 쉽게 변환 할 수 있습니다.

+0

lookbehind 연산자가 mozilla.dev.tech.js-engine 뉴스 그룹의 ECMAScript에 추가 될지 2 ~ 3 번 물었고 회신을받지 못했습니다. 자유롭게 음성을 추가하십시오. http://groups.google.com/group/mozilla.dev.tech.js-engine/browse_thread/thread/5d8e24ca46aa72f1?hl=ko# –

+0

빠른 답변을 보내 주셔서 감사합니다. 어리석은 소리는 들리지만, 선견자와 lookbehind의 주된 차이점을 이해하는 것은 매우 어렵다. 내 마음에 (나는 틀렸다는 것을 알고있다. 그렇지 않으면 두 가지 다른 이름이 없을 것이다!), 그냥 일부 문자를 검색하지만 대체 문자로 사용하지 않습니까? 그리고는 제안을 주셔서 감사합니다,하지만 난 내 해결 방법은 약간 깔끔한 생각합니다. :) – FrostbiteXIII

+0

이런 식으로 생각하십시오 .... 정규 표현식은 종종 현재 문자열에있는 위치를 추적하여 작동합니다. 이것은 당신이 어디 있었는지 (lookbehind)와 어디로 가고 있는지 (lookahead)를 알아내는 것을 희생시킬 수 있습니다. 아마도 현재 위치를 추적하는 비용 때문에 lookbehind를 구현하는 데 구현상의 어려움이있을 수 있습니다. –

3

당신은 내가 당신 (섹션 "매개 변수로 함수를 지정"참조) the functional form of Javascript String.replace를 사용하는 것이 좋습니다 것

$1%C2%A3 
+0

이것은 어떤 경우에는 너무 많이 일치하는 것 같습니다. 이것을 "ladskfjdkfj % A3"텍스트와 비교해 보면 kfj % A3이 일치하는 것 같습니다. –

+0

... 나는 타원을 제거 할 수 있지만 이후까지 그렇다하더라도 문자열 "ladskfjd % C2 % A3는"이 ... 자바 스크립트이 쉽게 제작되지 안하지만 일치! –

+0

@Tomalak : +1 그건 제가 썼을 것입니다. – Gumbo

1

(^.?.?|(?!%C2)...)%A3 

을 대체 할 수있다. 이렇게하면 필요한 경우 상태를 비롯한 임의의 논리를 정규식 일치 세션에 넣을 수 있습니다. 귀하의 경우, 원하는 대용품과 일치하는 간단한 정규 표현식을 사용하고, 함수 호출에서 정확한 기준을 충족하는지 테스트 할 수 있으며 일치하는 문자열을 그대로 반환합니다.

잠재적 인 겹치는 부분이 겹치는 경우 두 번째 일치가 누락 될 가능성이 있습니다. replace() 메소드에 실제로는 아님을 알리는 값을 반환 할 방법이 없으므로 결국 경기.