2013-08-29 3 views
1

나는 다음과 같은 정규 표현식이 있습니다정규 표현식

((^|[^a-zA-ZäöåüßÄÖÅÜ])'+targetword+'(?![a-zA-ZäöåüßÄÖÅÜ]))(?![^<]*(?:<\/script|>)) 

나는 targetword을 발견하고 그것의 링크를 만들기 위해 그것을 사용하고,하지만 단어가 포함되어 있지 않은 경우에만 다른 단어.

EDIT : 정규 표현식은 JavaScript, RegExp 객체에서 사용됩니다.

즉, 'the'은 연결되지만 o'the'r 또는 'the'apy은 연결되지 않습니다.

위의 식에도 링크의 선행 공백이 포함된다는 점이 문제입니다. 따라서 'the'은 링크 텍스트에서 ' the'이됩니다.

필자는이 사이트의 주요 공백을 찾아 제외시키는 몇 가지 해결책을 찾았지만 정규 표현식이 실제로 내 장담이 아니기 때문에 위의 표현식에 이들을 포함시키는 방법을 아직 찾지 못했습니다.

(?:(?:^|[^a-zA-ZäöåüßÄÖÅÜ])\s*(targetword)(?![a-zA-ZäöåüßÄÖÅÜ]))(?![^<]*(?:<\/script|>)) 

트릭을해야한다 (일치 참고하지만, targetword 앞에 배제 공백 (들)) targetword를 교체 :

답변

1

은 기본적으로 당신은 그냥 당신의 일치 그룹의 일부가 될 공백을 정의해야합니다 물론 당신의 변수와 함께.

+0

"(?<=[\s",.]|^)" + targetword + "(?=[\s",.\r\n]|$)"

나는이 솔루션을 구현했습니다. 이 연결 기능과 결합 된이 정규식은 실제로 선행 공간을 완전히 제거했지만 링크 생성 기능에 공간을 추가하여이 문제를 해결할 수있었습니다. –

1

이 정규식은 사용자가 찾고있는 것과 정확하게 일치하지 않지만 더 잘 작동합니다.

"\b" + targetword + "\b" 

\ b 's는 단어가 독립적이어야 함을 의미합니다. 여기에는 기호, 공백 및 숫자도 포함됩니다.

귀하가 원하던 것이 아니 었다면, 불편을 끼쳐 드려 죄송합니다. 그러나이 문자열 Sarah's car is broken에 단어 donald 및 문자열 O'Donald 또는 경기 Sarah에 일치합니다

+0

그건 효과가 없을 것입니다.자바 스크립트의 '\ b'는'ö '및'å '와 같이 악센트 부호가있는 문자를 단어 문자로 인식하지 않습니다. 그래서 (예를 들어)'\ bfoö \ b'와 일치 시키려고하면 'ö'다음의 위치가 단어 경계가 아니기 때문에 실패합니다. –

0

당신은 "\b" + targetword + "\b" 사용할 수 이것은 대부분의 경우에 작동합니다.

나는 모양 비하인드를 사용하고 앞의 문자가 뒤에 문자가 공백 문자열의 끝, 또는 허용

  • 공간, 문자열의 시작, 또는 허용 문장이다

    • 검증하기 위해 이것은 미리를 볼 것 구두점

    허용되는 문자는 실제 사용 사례에 맞게 조정할 수 있습니다. enter image description here

    NODE      EXPLANATION 
    -------------------------------------------------------------------------------- 
        (?<=      look behind to see if there is: 
    -------------------------------------------------------------------------------- 
        [\s",.]     any character of: whitespace (\n, \r, 
              \t, \f, and " "), '"', ',', '.' 
    -------------------------------------------------------------------------------- 
        |      OR 
    -------------------------------------------------------------------------------- 
        ^      the beginning of the string 
    -------------------------------------------------------------------------------- 
    )      end of look-behind 
    -------------------------------------------------------------------------------- 
        targetword    'targetword' 
    -------------------------------------------------------------------------------- 
        (?=      look ahead to see if there is: 
    -------------------------------------------------------------------------------- 
        [\s",.\r\n]    any character of: whitespace (\n, \r, 
              \t, \f, and " "), '"', ',', '.', '\r' 
              (carriage return), '\n' (newline) 
    -------------------------------------------------------------------------------- 
        |      OR 
    -------------------------------------------------------------------------------- 
        $      before an optional \n, and the end of 
              the string 
    -------------------------------------------------------------------------------- 
    )      end of look-ahead 
    
  • +0

    OP는 그가 사용하고있는 regex flavor를 말하지 않았지만 lookbehind를 지원하지 않는 JavaScript라고 확신합니다. –

    +0

    철저한 설명에 감사드립니다. @Alan Moore가 지적한 바와 같이, JavaScript가 생략 된 것에 대해 사과드립니다. 특히 솔루션을 실행 불가능하게 만드는 경우에 특히 그렇습니다. –