쉼표로 구분된 값 목록과 일치하는 정규식, 후행 쉼표는 허용되지 않습니다.

쉼표로 구분된 값 목록과 일치하는 정규식, 후행 쉼표는 허용되지 않습니다.

일치시키고 싶은 항목:

  1. 아아아
  2. 아아아아
  3. 아아아,bbb,ccc

하지만아니요후행 쉼표 목록입니다. 내 거현재의정규식:

(\w{3},?)+

또한 aaa,bbb,후행 쉼표( )가 있는 목록과 일치합니다. 나도 할 수 있을 줄 알았는데하다:

(\w{3})(,\w{3})*

하지만 꽤 추악합니다. 내 실제 정규식은 3글자 단어와 일치하지 않고 더 큰 단어와 일치하며 정규식을 반복하는 것은 보기 흉합니다. 이 문제를 어떻게 해결하나요?

답변1

이름을 지어주시면 됩니다PCRE의 정규식은 다음과 같습니다.

(?<big>[a-zA-Z0-9]+)

그 이후의 모든 내용은 ?<name>해당 이름으로 기록됩니다.
라고정규식 서브루틴

따라서 반복( ?&name)이 쉬워집니다.

^(?<big>[a-zA-Z0-9]+)(,(?&big))*$

온라인 테스트

따라서 IP 일치 등이 더 간단해집니다.

^(?<ip>25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(.(?&ip)){3}$

온라인으로 테스트해보세요.

다음과 같이 grep과 함께 사용하십시오.

grep -P '^(?<ip>25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(.(?&ip)){3}$'

답변2

perl또는 PCRE 정규식을 사용하는 경우 (?1)첫 번째 캡처 그룹에서 정규식을 참조하는 것과 같은 방법을 사용하여 중복을 피할 수 있습니다.

grep -Px '(?:(\w{3}),)*(?1)'

이는 3개의 문자 단어로 구성된 비어 있지 않은 쉼표로 구분된 목록과 일치합니다. 로 변경:

grep -Px '(?:(?:(\w{3}),)*(?1))?'

빈 목록이 허용됩니다.

답변3

사용 해주세요 -^((([a-zA-Z0-9]){1,45},){2}([a-zA-Z0-9]){1,45})$

여기서는 영어의 가장 긴 단어가 45자이므로 최대 글자 수를 45자로 설정했는데, 요구 사항에 따라 변경할 수 있습니다.

답변4

정규식은 간단합니다. [^,]$질문에 답해 보세요.

의견을 보내주신 @Hkoof에게 감사드립니다!

관련 정보