자음으로 구분된 동일한 모음을 가진 단어 찾기

자음으로 구분된 동일한 모음을 가진 단어 찾기

텍스트에서 모음-자음-동모음 패턴이 있는 단어를 찾기 위해 grep 매개변수를 찾고 있습니다.

예:

오로

루오ofo
피어 투 피어펄 코튼피어 투 피어

감사해요.

답변1

모음의 형성은 언어와 지역에 따라 다릅니다.

인식된 영어 모음의 경우(여기에서는 소문자 버전만 고려됨):

vowels=aeiou
consonants=bcdfghjklmnpqrstvwxyz

grep "\([$vowels]\)[$consonants]\1"

$vowels당신 의 언어 에 적응할 수 있습니다 $consonants.

그러나 유니코드를 사용하면 약간 복잡해질 수 있습니다.

예를 들어 라틴 알파벳으로 제한하더라도 프랑스어에서는 여름(été)이라는 단어와 일치합니다. 그러나 유니코드에서 é는 단일 문자(U+00E9)로 작성 하거나 뒤에 é오는 분해된 형식으로 작성할 수 있습니다.e결합하다날카로운 악센트( ◌́U+0301).

그 외에 이런 문자도 있는데 , 이는 2자를 쓰는 또 다른 방법이다 fi.

이 문제를 해결하는 한 가지 방법은 텍스트를 다음으로 변환하는 것입니다.표준화된 형태e⃞확인하기 전에 다중 문자 형식으로 확장합니다. 그런 다음 기본 문자와 발음 구별 부호 또는 기타 결합 문자( != 와 같은 완전한 문자소 클러스터)의 시퀀스를 고려해야 합니다 é̂.

perl -MUnicode::Normalize -C -lne '
  print if NFKD($_) =~ /((?=[aeiouy])\X)(?=[bcdfghjklmnpqrstvwxz])\X\1(?!\p{mark})/'

(NKFD는 표준화된 형식입니다.호환성 분석ée, + ◌́및 + 가 되는 것 ).fi

\Xperl게임 에서확장된 문자소 클러스터. (?=[aeiouy])\X기본 문자가 소문자 라틴어 모음(so e또는 ...)인 é문자소 클러스터의 경우에도 마찬가지입니다 . 여기에는 y모음으로 포함됩니다(라틴 알파벳을 사용하는 많은 언어에서 모음으로 간주되기 때문입니다).

따라서 우리는 모음 클러스터, 자음 클러스터, 그리고 에서 캡처된 첫 번째 클러스터를 일치시킵니다 \1. 하지만 다음 문자가 여전히 해당 클러스터의 일부가 아닌지 확인해야 합니다. 그렇지 않으면 이와 유사한 것과 일치합니다 eté. 따라서 다음 문자에 해당 속성이 없는지 확인하려면 부정 예측 연산자를 사용하십시오 mark.

따라서 다음과 같은 입력의 경우:

fini
été
tacheté

다음을 반환합니다.

fini
été

관련 정보