문제

나는 그 단어가 진정으로 단어 일 때 충분히 쉬운 단어 목록을 일치시키고 싶습니다. 예를 들어 /\b (pop|push) \b/gsx 문자열에 대항 할 때

팝은 문을 밀어 냈지만 뒤로 튀어 나왔습니다.

팝과 푸시라는 단어와 일치하지만 튀어 나오지 않습니다.

일반적으로 단어 경계 자격을 갖춘 문자가 포함 된 단어에 대해서도 비슷한 기능이 필요합니다. 그래서 필요합니다 /\b (reverse!|push) \b/gsx 문자열에 대항 할 때

리버스 푸시! 리버스! 푸시

리버스 만 일치하려면! 푸시하지만 반대로 일치하지 않습니다! 푸시. 분명히이 regex는 그렇게하지 않을 것이므로, 이러한 펑키 한 요구 사항을 처리 할 수있을 정도로 정규식을 똑똑하게 만들기 위해 b 대신 무엇을 사용해야합니까?

도움이 되었습니까?

해결책

단어의 끝에서 b는 "이전 캐릭터는 단어 캐릭터 였고 다음 캐릭터 (다음 문자가있는 경우)는 단어 문자가 아닙니다. 비가 없을 수 있기 때문에 첫 번째 조건을 삭제하고 싶습니다. -"단어"의 끝에있는 단어 캐릭터.

/\b (reverse!|push) (?!\w)/gx

나는 AS3 Regexes가 Lookahead를 지원한다고 확신합니다.

다른 팁

첫 번째 문제는 교대가 아닌 3 개의 (아마도 4 개) 사례가 필요하다는 것입니다.

  • /\breverse!(?:\s|$)/ 뒤집다! 그 자체로
  • /\bpush\b/ 스스로 밀어 넣으십시오
  • /\breverse!push\b/ 함께
  • /\bpushreverse!(?:\s|$)/ 이것은 가능한 경우입니다

두 번째 문제는 a \b a. 후에는 일치하지 않습니다 "!" 그것은 아니기 때문에 \w. 여기에 무엇이 있습니다 Perl 5는 말해야합니다 \b, 문서에 동의하는지 확인하려면 문서에 문의를 할 수 있습니다.

단어 경계 ( " b")는 한쪽의 " w"가있는 두 문자 사이의 지점과 다른쪽에 " w"가있는 지점입니다. " w"와 일치하는 문자열의 시작과 끝. (문자 클래스 내에서 " b"내에서는 두 배의 인용 문자열에서와 같이 단어 경계가 아닌 백 스페이스를 나타냅니다.)

그래서, 당신이 필요로하는 정규식은

/ \b ( reverse!push | reverse! | push ) (?: \s | \b | $ )+ /gx;

나는 /s 이 동선에는 기간이 없기 때문에 한 줄로 취급하는 것은 의미가 없습니다. 만약에 /s 엔진에서 단일 라인으로 취급한다는 의미는 아닙니다. 또한 엔진이 교대를 처리하는 방법을 읽어야합니다. Perl 5에서 올바른 동작을 얻으려면 이런 식으로 항목을 배열해야합니다 (그렇지 않으면 Reverse! 항상 리버스! 푸시).

b를 동등한 것으로 바꾸지 만 덜 엄격하게 대체 할 수 있습니다.

/(?<=\s|^)(reverse!|push)(?=\s|$)/g

이런 식으로 제한 요인 \b (실제 전후에만 일치 할 수 있습니다. \w 단어 문자)가 제거됩니다.

이제 문자열의 공백 또는 시작/끝은 유효한 분리기로 기능하며, 예를 들어 검색어 목록에서 내부 표현식을 런타임에 쉽게 구축 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top