문제

예를 들어이 텍스트에서 :

Lorem ipsum dolor sit amet, consectetur hoodiscing elit. Nunc eu tellus vel nunc pretium lacinia. proin sed lorem. Cras sed ipsum. 수녀를 수녀 quis risus sollicitudin inmerdiet.

나는 'ipsum'이후에 단어를 일치시키고 싶습니다.

도움이 되었습니까?

해결책

이것은 외관을위한 직업처럼 들리지만, 모든 정규식 풍미가 그들을 지원하는 것은 아니라는 것을 알고 있어야합니다. 예에서 :

(?<=\bipsum\s)(\w+)

이것은 "ipsum"을 따르는 일련의 문자와 일련의 문자와 공간이 뒤 따릅니다. 그렇습니다 ~ 아니다 "ipsum"자체를 일치 시키면, 예를 들어 교체품의 경우 다시 삽입 할 필요가 없습니다.

그러나 내가 말했듯이, 일부 맛 (예 : JavaScript)은 외관을 전혀지지하지 않습니다. 다른 많은 사람들 (실제로)은 "고정 너비"외관 만 지원 하므로이 예제를 사용할 수는 있지만 반복 연산자는 사용할 수 없습니다. (다시 말해, (?<=\b\w+\s+)(\w+) 그렇지 않을 것입니다 일하다.)

다른 팁

다른 응답자 중 일부는 Lookbehinds에 의존하지 않는 Regex를 사용하는 것을 제안했지만, 포인트를 얻으려면 완전하고 작동하는 예가 필요하다고 생각합니다. 아이디어는 전체 시퀀스 ( "ipsum"과 다음 단어)를 정상적인 방식으로 일치시킨 다음 캡처 그룹을 사용하여 관심있는 부분을 분리하는 것입니다. 예를 들어:

String s = "Lorem ipsum dolor sit amet, consectetur " +
    "adipiscing elit. Nunc eu tellus vel nunc pretium " +
    "lacinia. Proin sed lorem. Cras sed ipsum. Nunc " +
    "a libero quis risus sollicitudin imperdiet.";

Pattern p = Pattern.compile("ipsum\\W+(\\w+)");
Matcher m = p.matcher(s);
while (m.find())
{
  System.out.println(m.group(1));
}

이이 "Dolor"와 "Nunc"을 모두 인쇄합니다. LookBehind 버전으로 그렇게하려면 다음과 같은 작업을 수행해야합니다.

Pattern p = Pattern.compile("(?<=ipsum\\W{1,2})(\\w+)");

그것은 Java에 있으며, 이는 Lookbehind가 명백한 최대 길이를 가져야합니다. 어떤 맛에는 그다지 유연성이 많지 않으며 물론 일부는 외관을 전혀지지하지 않습니다.

그러나 사람들이 예를 들어 가장 큰 문제는 외모가 아니라 단어 경계가있는 것 같습니다. David Kemp와 CK는 모두 기대하는 것 같습니다 \b 'M'을 따르는 공간 문자와 일치하지만 그렇지 않습니다. 위치 (또는 경계)와 일치합니다. ~ 사이 'M'과 공간.

몇 권의 책과 튜토리얼에서 반복 된 것은 일반적인 실수입니다. \b, 어떤 캐릭터도 일치하지 않습니다. 룩 어라운드 및 앵커와 같은 세기의 어설 션입니다.^, $, \z, 등), 그리고 그것이 일치하는 것은 단어 문자에 앞서 있고 하나 뒤에는 하나가 뒤 따르거나 단어 문자가 뒤 따르는 위치입니다.

ipsum b ( w*)

와 함께 javascript 당신이 사용할 수있는 (?=ipsum.*?(\w+))

이것은 두 번째 발생도 얻을 것입니다 (Nunc)

ipsum b (.*) b

편집 : REGEX 구현에 따라 배가 고프고 ipsum 이후의 모든 단어를 찾을 수 있습니다.

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