각 그룹의 문자가 알파벳순으로 정렬된 모든 UUID를 찾는 정규식

각 그룹의 문자가 알파벳순으로 정렬된 모든 UUID를 찾는 정규식

UUID는 '-'로 구분된 5개의 그룹으로 구성되며 16진수 문자로 구성됩니다. 각 그룹의 문자가 알파벳순으로 정렬된 모든 UUID를 찾는 정규식을 만들려고 합니다.

입력하다:

9a578cf1-bc9f-49ad-8294-a61b736088c5
64efc3d9-448a-4902-a6c6-61849ac6c7ef
75b39f65-b614-427a-af62-922534bee490

산출:

9a578cf1-bc9f-49ad-8294-a61b736088c5

각 문자 세트는 acf bcf ad abc이며 알파벳 순서로 정렬됩니다.

두 번째 UUID의 각 그룹에 있는 문자는 알파벳 순서가 아닙니다: efc 및 accef

또한 그룹에는 동일한 문자가 한 번만 있을 수 있으므로 세 번째 UUID의 "bee"도 알파벳순으로 간주되지 않습니다.

다음 grep 명령을 사용해 보았습니다.

grep -P "^[0-9]*a?[0-9]*b?[0-9]*c?[0-9]*d?[0-9]*e?[0-9]*f?[0-9]*(-[0-9]*a?[0-9]*b?[0-9]*c?[0-9]*d?[0-9]*e?[0-9]*f?[0-9]*){4}$" file.txt

하지만 이로 인해 역추적 오류가 발생합니다.

답변1

grep느리기는 하지만 GNU 3.7 및 3.8 버전 에서 작동합니다 .

다른 grep구현 및/또는 버전이나 다른 정규식 엔진으로 전환하면 도움이 될 수 있습니다. 코드에는 Perl과 관련된 내용이 없습니다. 예를 들어 -E여기에서 대신 사용할 수 있습니다(-Pegrep알고리즘은 역추적의 필요성을 방지합니다.여기).

(?>...)어떤 경우든 역추적은 불필요하고 비생산적이므로 (perl 확장 프로그램)을 사용하여 역추적을 완전히 비활성화하는 것이 좋습니다 .

grep -Px '(?>(\d*a?\d*b?\d*c?\d*d?\d*e?\d*f?\d*)(?:-(?1)){4})'

몇 가지 추가 단축키가 있습니다:

  • -x 대신 사용 ^하고 $고정하십시오.
  • \d대신 [0-9](펄 확장)
  • (?1)중복을 피하기 위해 첫 번째 세트와 동일한 정규식을 호출합니다(perl 확장).

관련 정보