2009-07-15 7 views
-2

특정 상황에서 다른 도메인을 가리 키도록 URL을 다시 작성하는 ASP.NET 응답 필터를 작성하고 있습니다.정규 표현식에서 부정적인 lookbehind에 대한 도움말

ASP.NET이 응답을 작성하기 때문에 내 필터가 페이지가 완전히 스트리밍되기 전에 여러 번 호출됩니다. 이것은 Regex.Replace에 대한 각각의 호출이 URL을 두 번 바꾸지 않는다는 것을주의해야한다는 것을 의미합니다 (You는 http://foo.comhttp://foo.com/path으로 끝납니다).

이 작업을 수행하려면, 나는 대체에 대한 부정적인 lookbehind 식을 사용하기 위해 노력하고있어,하지만 작동하지 않는 것 :

((?<!http://www.foo.com/)actual/url) 
:이 같은 정규식을 생성

content = Regex.Replace(content,"((?<!" + newDomain + ")" + match + ")", newDomain + match); 

그러나 뒤에서 보이는 것을 존중하지 않는 것으로 보입니다. 모든 것을 두 번 교체하려고합니다.

아이디어가 있으십니까?

EDIT :이 정규식은 Regex Coach와 같은 도구를 사용하여 샘플 데이터를 테스트 할 때 유용합니다.

편집 2 : 실제로 슬래시가 추가되었습니다.

+0

에서 왔 "와 일치"않습니다 어디? 더 정확히 말하면 콘텐츠에서 URL을 구문 분석하여 콘텐츠를 가져 왔습니까? 그 "match"는 그 라인 이전에 어떤 모습입니까? – mercator

+0

도메인이나 경로를 바꾸시겠습니까? 당신이 Regex Coach에서 기대하는 일치를 얻었지만 예상 한 대치 동작을 얻지는 못했다고 진술합니다. –

+0

와우, 피드백없이 -1 번 모두 내 대답에. –

답변

1

생각을 몇 :

  • 당신은 탈출해야합니까. 정규식에? 나는 <! 문법을 모르며 내 책을 가지고 있지 않아서 이것이 논점이 될 수 있습니다.
  • 귀하의 예에서 www.foo.com이 없기 때문에/http://www.foo.com/something과 일치하지 않습니다.

그 중 일부는 도움이 될 것입니다.

0

난 단지 도메인 NEWDOMAIN되지이고 경로가 일치이

content = Regex.Replace(content,"(?<!" + newDomain + ")^[^/]+/(?=" + match + ")", newDomain + match); 

이 일치 시도 (따라서 표현의 도메인 부분을 대체 할) 것입니다.

+0

이유 투표? 문제가 해결되지 않는 경우, 이유를 설명해주십시오. 우리는 초능력 디버거가 아닙니다. –

0

어쩌면 내가 누락되었지만 어쩌면 부정적인 lookbehinds를 사용해야합니까? lookbhind는 본질 상 어떤 것도 일치하지 않습니다. 반면에 도메인과 경로를 일치시키고 도메인을 교체하려고합니다. 권리?

Regex.Replace("http://www.foo.com/something", "(http://www.foo.com/)(something)", "http://www.abc.com/$2") 

아이디어는 당신의 이점에 그룹화 사용하는 것입니다

그래서 더 같은 것을해야한다. $ 2 부분이 경기의 후반부 (경로)를 잡고 새 도메인에 추가하는 곳입니다. 나는 이것을 Regex Hero (.NET regex tester)에서 테스트했으며 작동한다. 그런데 Regex Coach는 Perl 기반이며 .NET 정규식 엔진과 비교할 때 약간의 차이가있을 수 있습니다.

2

세 번째 각도로 시도해 보겠습니다.

당신이 당신의 정규 표현식이 당신이 원하는 부분과 일치하는 정규 표현식 코치의 어떤 것과 "일치"한다는 사실을 혼란스럽게 생각한다고 생각합니다. 따라서 결과를 바꾸면 놀라실 것입니다.

교체 토큰 모두가 새 토큰에 대해과 일치합니다.

음수 lookbehind는 패턴이 존재하지 않지만 패턴은 일치 입력 의 일부가 아닙니다.

URL의 경로 (일치 문자열) 만 일치 입력이고이를 newDomain 변수로 바꾸므로 결과가 나타납니다.

그래서 당신은 당신이 얻고있는 결과를 얻고 있습니다.

0

문자열에서 교체 할 도메인 부분을 찾지 못했을 때 교체하는 방법은 어떻습니까?

즉, 속기로 펄을 남용하기 : 정확히 변수는

if ($string !~ /foo\.com) { 
    $string = $domain . $string; 
}