[regex] 중복 단어에 대한 정규식

저는 정규식 초보자이고 다음과 같은 중복 된 연속 단어를 “일치”하는 단일 정규식을 작성하는 방법을 알 수 없습니다.

파리 하여 봄.

아니 그 그 관계가있다.

왜 웃어요? 인가 내 내 정규 표현식은 나쁜?

위의 모든 굵은 문자열과 일치하는 단일 정규식이 있습니까?



답변

다음 정규식을 시도하십시오.

\b(\w+)\s+\1\b

다음 \b은 단어 경계이며 \1첫 번째 그룹의 캡처 된 일치를 참조합니다.


답변

이 정규식이 더 많은 상황을 처리한다고 생각합니다.

/(\b\S+\b)\s+\b\1\b/

좋은 테스트 문자열은 여기에서 찾을 수 있습니다 : http://callumacrae.github.com/regex-tuesday/challenge1.html


답변

아래 RE로 시도하십시오.

  • \ b 단어 단어 경계의 시작
  • \ W + 모든 단어 문자
  • \ 1 이미 일치하는 같은 단어
  • \ b 단어 끝
  • () * 다시 반복

    public static void main(String[] args) {
    
        String regex = "\\b(\\w+)(\\b\\W+\\b\\1\\b)*";//  "/* Write a RegEx matching repeated words here. */";
        Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE/* Insert the correct Pattern flag here.*/);
    
        Scanner in = new Scanner(System.in);
    
        int numSentences = Integer.parseInt(in.nextLine());
    
        while (numSentences-- > 0) {
            String input = in.nextLine();
    
            Matcher m = p.matcher(input);
    
            // Check for subsequences of input that match the compiled pattern
            while (m.find()) {
                input = input.replaceAll(m.group(0),m.group(1));
            }
    
            // Prints the modified sentence.
            System.out.println(input);
        }
    
        in.close();
    }

답변

널리 사용되는 PCRE 라이브러리는 이러한 상황을 처리 할 수 ​​있습니다 ( 하지만 POSIX 호환 정규식 엔진으로 동일하게 달성 할 수 없습니다 ).

(\b\w+\b)\W+\1


답변

이것은 내 트 위치 봇에서 중복 문구를 제거하는 데 사용하는 정규식입니다.

(\S+\s*)\1{2,}

(\S+\s*) 공백이 아닌 문자열을 찾은 다음 공백을 찾습니다.

\1{2,}그런 다음 일치시킬 문자열에서 해당 구문의 2 개 이상의 인스턴스를 찾습니다. 동일한 문구가 3 개 있으면 일치합니다.


답변

연속 된 단어 수를 찾으려면 아래 표현식이 올바르게 작동해야합니다. 일치는 대소 문자를 구분하지 않을 수 있습니다.

String regex = "\\b(\\w+)(\\s+\\1\\b)*";
Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);

Matcher m = p.matcher(input);

// Check for subsequences of input that match the compiled pattern
while (m.find()) {
     input = input.replaceAll(m.group(0), m.group(1));
}

샘플 입력 : Goodbye goodbye GooDbYe

샘플 출력 : Goodbye

설명:

정규식 :

\ b : 단어 경계의 시작

\ w + : 모든 단어 문자

(\ s + \ 1 \ b) * : 이전 단어와 일치하고 단어 경계로 끝나는 단어가 뒤에 오는 임의의 수의 공백. *로 묶인 모든 것은 하나 이상의 반복을 찾는 데 도움이됩니다.

그룹화 :

m.group (0) : 위의 경우 일치하는 그룹을 포함합니다 Goodbye goodbye GooDbYe

m.group (1) : 위의 경우 일치하는 패턴의 첫 단어를 포함합니다 Goodbye

Replace 메서드는 연속적으로 일치하는 모든 단어를 단어의 첫 번째 인스턴스로 대체합니다.


답변

아니요. 그것은 불규칙한 문법입니다. 사용할 수있는 엔진 / 언어 별 정규식이있을 수 있지만이를 수행 할 수있는 범용 정규식은 없습니다.