텍스트에서 모음-자음-동모음 패턴이 있는 단어를 찾기 위해 grep 매개변수를 찾고 있습니다.
예:
오로
엔
루오ofo
피어 투 피어펄 코튼피어 투 피어
감사해요.
답변1
모음의 형성은 언어와 지역에 따라 다릅니다.
인식된 영어 모음의 경우(여기에서는 소문자 버전만 고려됨):
vowels=aeiou
consonants=bcdfghjklmnpqrstvwxyz
grep "\([$vowels]\)[$consonants]\1"
$vowels
당신 의 언어 에 적응할 수 있습니다 $consonants
.
그러나 유니코드를 사용하면 약간 복잡해질 수 있습니다.
예를 들어 라틴 알파벳으로 제한하더라도 프랑스어에서는 여름(été)이라는 단어와 일치합니다. 그러나 유니코드에서 é는 단일 문자(U+00E9)로 작성 하거나 뒤에 é
오는 분해된 형식으로 작성할 수 있습니다.e
결합하다날카로운 악센트( ◌́
U+0301).
그 외에 이런 문자도 있는데 fi
, 이는 2자를 쓰는 또 다른 방법이다 fi
.
이 문제를 해결하는 한 가지 방법은 텍스트를 다음으로 변환하는 것입니다.표준화된 형태e⃞
확인하기 전에 다중 문자 형식으로 확장합니다. 그런 다음 기본 문자와 발음 구별 부호 또는 기타 결합 문자( != 와 같은 완전한 문자소 클러스터)의 시퀀스를 고려해야 합니다 é̂
.
perl -MUnicode::Normalize -C -lne '
print if NFKD($_) =~ /((?=[aeiouy])\X)(?=[bcdfghjklmnpqrstvwxz])\X\1(?!\p{mark})/'
(NKFD는 표준화된 형식입니다.호환성 분석é
e
, + ◌́
및 + 가 되는 것 fi
).f
i
\X
perl
게임 에서확장된 문자소 클러스터. (?=[aeiouy])\X
기본 문자가 소문자 라틴어 모음(so e
또는 ...)인 é
문자소 클러스터의 경우에도 마찬가지입니다 . 여기에는 y
모음으로 포함됩니다(라틴 알파벳을 사용하는 많은 언어에서 모음으로 간주되기 때문입니다).
따라서 우리는 모음 클러스터, 자음 클러스터, 그리고 에서 캡처된 첫 번째 클러스터를 일치시킵니다 \1
. 하지만 다음 문자가 여전히 해당 클러스터의 일부가 아닌지 확인해야 합니다. 그렇지 않으면 이와 유사한 것과 일치합니다 eté
. 따라서 다음 문자에 해당 속성이 없는지 확인하려면 부정 예측 연산자를 사용하십시오 mark
.
따라서 다음과 같은 입력의 경우:
fini
été
tacheté
다음을 반환합니다.
fini
été