정규식: 자음 개수가 홀수인 그리스 문자가 13개인지 확인하는 방법

정규식: 자음 개수가 홀수인 그리스 문자가 13개인지 확인하는 방법

내가 해독할 수 없는 또 다른 정규식 :(

나는 전에 시도했다egrep '([qwrtzpsdfghjklxcvbnmy]{1})|([qwrtzpsdfghjklxcvbnmy]{3})|([qwrtzpsdfghjklxcvbnmy]{5})|([qwrtzpsdfghjklxcvbnmy]{7})' greek.txt

그러나 이것은 자음이 4개인 단어도 반환하는데, 왜 그런지 모르겠습니다. 모음이 4개인 단어도 일치하는 이유는 무엇입니까?

이것은 내 Greek.txt입니다.

alpha
beta
gamma
delta
epsilon
zeta
eta
theta
iota
kappa
lambda
mu
nu
xi
omicron
pi
rho
sigma
tau
upsilon
phi
chi
psi
omega

따라서 알파는 양호(lph = 3), 베타는 양호(bt = 2), 감마는 양호(gmm = 3), 델타는 양호(dlt = 3) 등입니다.

답변1

[abcde]{3}set 에서 세 개의 연속 문자와 일치합니다 abcde. 따라서 그룹에서 1개, 3개, 5개 또는 7개의 연속 문자를 포함하는 줄을 찾고 있습니다. 이는 해당 문자 중 하나가 포함된 줄을 찾는 것과 같습니다.

그리스 문자를 찾으려면 첫 번째 단계는 패턴을 라틴 문자가 아닌 그리스 문자와 일치하도록 만드는 것입니다. 최소 13개의 그리스 문자가 포함된 행을 찾으려면 "그리스 문자 다음에 다른 문자가 옵니다."라는 패턴이 13번 나타나는지 찾으십시오. 다음은 소문자 일반 그리스 문자만 찾는 패턴입니다.

<greek.txt grep -E '([αβγδεζηθικλμνξοπρςστυφχψω].*){13}'

13개의 일반 그리스 문자와 luGl이 아닌 다른 문자가 포함된 줄을 원하는 경우 결과를 필터링하여 14개의 luGl이 포함된 줄을 제거하세요.

<greek.txt grep -E '([αβγδεζηθικλμνξοπρςστυφχψω].*){13}' |
grep -v -E '([αβγδεζηθικλμνξοπρςστυφχψω].*){14}'

정확히 13 luGl만 포함하고 다른 문자는 포함하지 않는 줄을 원하는 경우:

<greek.txt grep -x -E '[αβγδεζηθικλμνξοπρςστυφχψω]{13}'

이제 짝수 자음을 원할 경우 "자음이 없는 것 뒤에 짝수가 오는 것(자음 뒤에 자음이 없는 것)"으로 구성된 줄을 찾으세요. 홀수의 경우 마지막 하위 패턴의 또 다른 발생을 추가합니다.

cons="βγδζθκλμνξπρςστφχψω"
<greek.txt grep -E "^[^$cons]*([$cons][^$cons]*[$cons][^$cons]*)*[$cons][^$cons]"

Perl에서는 그리스 문자를 패턴 에 일치시키고 \p{Greek}모든 알파벳의 소문자를 패턴 에 일치시킬 수 있습니다 \p{Ll}. 소문자 그리스 문자를 찾으려면 를 찾으세요 (?=\p{Ll})\p{Greek}. 유니코드 의미론을 사용하여 스크립트를 실행해야 합니다. 가장 쉬운 방법은 이 옵션을 사용하여 실행하는 것입니다 -C. () = m/REGEXP/g일치 항목 수를 계산하는 데 사용되는 Perl 관용어입니다.

<greek.txt perl -C -l -ne 'print if (() = m/(?:(?=\p{Ll})\p{Greek})/g) == 13'

그리스어 모음을 일치시키는 기본 제공 방법이 없으므로 질문의 두 번째 부분에 대한 Perl 솔루션은 명시적으로 일치해야 합니다.

관련 정보