(x 아님) 및 y(!x&y)와 일치시킬 정규식

(x 아님) 및 y(!x&y)와 일치시킬 정규식

퍼즐이 포함된 데스크탑 일일 달력을 받았습니다. 퍼즐 중 하나는 문자 대신 기호를 사용하는 인용문을 해독하는 것입니다. 나는 긴 단어를 찾기 위해 몇 가지 정규식을 사용하고, 반환된 단어를 사용하여 더 작은 단어를 해결합니다. 퍼즐에서 흰색 배경 기호는 모음("y" 포함)이고 음영 처리된 배경 기호는 자음입니다.

아래에서는 임의의 문자를 사용하겠습니다. 굵은 글씨는 자음을 나타내고, 일반 문자는 모음을 나타내고, 이탤릭체는 문자가 지침에 나와 있음을 나타냅니다.

두번째산소QQ두번째

위의 예는 정규식을 사용하여 "happy"로 해석됩니다("e"는 이미 퍼즐에 제공되어 있습니다).

 egrep -i '^[bcdfghjklmnpqrstvwxz][aiouy][bcdfghjklmnpqrstvwxz]{2}[aiouy]$' words

결과는 많지만 다음과 같이 논리적으로 지정하면 정규식을 더 좋게 만들 수 있을 것 같습니다.

  1. 문자 1은 자음입니다.
  2. Char 2는 모음이지만 지침에 표시된 "e"는 아닙니다.
  3. 3번과 4번 글자는 같은 자음이지만 1번 글자와는 다릅니다.
  4. 문자 5는 모음이지만 문자 2와는 다릅니다.

또 다른 예는

산소오른쪽 이자형 와트산소N

grep 문을 어디에 사용했나요?

egrep -i '^([aiouy])[bcdfghjklmnpqrstvwxz]e[bcdfghjklmnpqrstvwxz][aiouy][bcdfghjklmnpqrstvwxz]\1n$' words

검색은 논리적으로 다음과 같이 정의됩니다.

  1. Char 1은 모음이며 동일한 문자가 단어의 뒷부분에 나타나기 때문에 캡처 그룹입니다.
  2. Char 2는 자음입니다.
  3. 주어진 문자 3은 "e"입니다.
  4. 4자는 자음입니다.
  5. Char 5는 모음입니다.
  6. 6번째 문자는 자음입니다.
  7. Char 7과 Char 1은 동일한 모음입니다.
  8. 주어진 문자 8은 "n"입니다.

다행히 grep 문은 "American"이라는 단어를 반환했습니다(비밀 텍스트는 영화 대사였습니다). Char 4는 char 2와 달리 자음이고 char 5는 char 1과 달리 모음이라는 것을 정규식에서 지정할 수 있기를 원합니다.

이 패턴 매칭을 정규식으로 물어볼 수 있나요? (x|y)선언 문자의 구문이 '일 수 있다는 것을 알고 있습니다 .엑스' 또는'와이', 하지만 지정할 구문(존재하는 경우)을 모르겠습니다.(!x) & y

답변1

부정적인 예측 기능과 함께 Perl 정규 표현식을 사용할 수 있습니다.

$ grep -Pi '^([aeiouy])([bcdfghjklmnpqrstvwxz])e(?!\2)([bcdfghjklmnpqrstvwxz])(?!\1)([aeiouy])(?!\2)(?!\3)([bcdfghjklmnpqrstvwxz])\1n$' /usr/share/dict/words
American
american
everymen

확장:

$ perl -lnE '
    BEGIN { $vowel = qr/[aeiouy]/i; $consonant = qr/[bcdfghjklmnpqrstvwxz]/i }
    say if /^ ($vowel)                  # vowel
              ($consonant)              # consonant
              e                         # literal
              (?!\2)($consonant)        # different consonant
              (?!\1)($vowel)            # different vowel
              (?!\2)(?!\3)($consonant)  # 3rd different consonant
              \1                        # first vowel again
              n                         # literal
            $/xi
' /usr/share/dict/words
American
american
everymen

BOQQE의 예는 다음과 같습니다.

grep -Pi '^([bcdfghjklmnpqrstvwxz])([aiouy])(?!\1)([bcdfghjklmnpqrstvwxz])\3(?!\2)([aiouy])$' /usr/share/dict/words

내 사전은 779개의 결과를 반환했습니다(444개의 대소문자 구분).

관련 정보