정규식 posix 클래스를 사용한 문자열 유효성 검사

정규식 posix 클래스를 사용한 문자열 유효성 검사

파일의 주소 필드에 대한 유효성 검사를 구축하려고 합니다.

파일은 다음과 같습니다.

123 Strata Ln.
15 138th Ave
27 Hilltop Dr. Apt. 7
F52 Milk Ln.
156A Fantastic St.
56 sample Ln.

조건은 다음과 같습니다.

숫자 - 최소 한 자리 이상, 그 뒤에 추가 숫자가 옵니다.

거리 이름 - 대문자 또는 숫자로 시작하고 그 뒤에 소문자 및 대문자, 숫자 또는 마침표(.)가 이어지는 임의 개수의 단어(최소 1개)

편집: 이러한 조건에서는 파일의 처음 세 줄만 유효합니다.

내가 시도한 것은 다음과 같습니다.

'^[[:digit:]][[:digit:]]+ ([[:upper:]]|[[:digit:]])([[:alphabet:]]|[[:digit:]])+\.$'

하지만 작동하지 않는 것 같습니다. 도움이 필요하세요?

답변1

최소한 하나의 숫자, 그 뒤에 임의의 숫자의 추가 숫자가 옵니다.

+이미 "하나 이상"이므로 [[:digit:]][[:digit:]]+적어도 2개가 필요합니다. 그래서 [[:digit:]]+.

각각 대문자 또는 숫자로 시작하고 그 뒤에 임의 개수의 소문자 및 대문자, 숫자 또는 마침표(.)가 오는 단어(최소 하나)

대문자 또는 숫자: 괄호 안에 두 문자 클래스를 모두 사용할 수 있으므로 여기서는 [[:upper:][:digit:]]( )를 번갈아 사용할 필요가 없습니다 .|

[[:alphabet:]]유효한 문자 클래스는 아니지만 alphaand alnum(문자 또는 숫자용)가 있습니다. 후자가 유용할 수 있습니다.

한 문장으로:[[:upper:][:digit:]][[:alnum:].]*

각 단어 앞에 공백이 있는 여러 단어(앞 숫자 뒤의 공백도 처리 가능):([[:blank:]]+[[:upper:][:digit:]][[:alnum:].]*)+

전체 줄을 일치시키려면 끝에 ^and 를 추가하거나 를 사용하십시오. 실수로 쉽게 남을 수 있는 후행 공백을 허용하려면 끝(앞)에 추가해야 할 수도 있습니다 .$grep -x[[:blank:]]*$

그러면 예제 입력의 처음 세 줄만 인쇄됩니다.

grep -E '^[[:digit:]]+([[:blank:]]+[[:upper:][:digit:]][[:alnum:].]*)+$' file

정규식을 사용하기 위한 온라인 도구가 있습니다.https://regex101.com/ 이는 테스트에 유용할 수 있습니다. 위의 요구 사항은 (대안이 추악하기 grep -E때문 )이지만 regex101이 간단한 기본 정규 표현식을 +허용하지 않는다고 생각합니다 .grep

관련 정보