Bash에서 정규식을 사용하여 유효한 (하위)도메인 확인

Bash에서 정규식을 사용하여 유효한 (하위)도메인 확인

정규식 테스트 사이트에서 테스트하면 아래 정규식이 정확합니다. 그러나 아래 코드는 어떠한 입력도 허용하지 않습니다. 내가 시도한 모든 것이 잘못되었습니다.

   #!/bin/bash


    domainRegex="(?=^.{4,253}$)(^(?:[a-zA-Z0-9](?:(?:[a-zA-Z0-9\-]){0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}$)"


    while [ "$domain" = "" ]
    do
            echo "Please provide domain:"
            read domain
    done

    until [[ $domain =~ $domainRegex ]]
    do
            echo "Enter valid domain:"
            read domain
    done

답변1

PCRE(Perl Compatible Regular Expressions) 기능을 사용하고 있습니다. 즉, Bash에서 사용하는 표준 확장 정규식의 일부가 아닙니다 (?=...).(?:...)

(?=^.{4,253}$)하지만 제 생각에는 문자열의 길이를 확인하기 위해 전자를 사용하고 있는 것 같습니다 . 이것이 맞다면 문자열 길이에 대한 직접 테스트로 쉽게 대체될 수 있습니다.

if [ "${#domain}" -lt 4 ] || [ "${#domain}" -gt 253 ]; then
    echo "Domain name is too short or too long"
fi

글쎄, 쉽게 말하면 캡처하지 않는다는 점을 제외 (?:...)하면 동일합니다 . (...)추가 캡처는 전체 정규식을 일치시키는 데 중요하지 않으므로 ?:각 여는 괄호에서 이를 제거할 수 있습니다.

또한 (적어도 ERE에서는) 백슬래시 [a-zA-Z0-9\-]단어백슬래시. 대시는 대괄호 그룹의 첫 번째 또는 마지막 문자로 간단히 일치됩니다(PCRE 및 ERE에서) [a-zA-Z0-9-].

이러한 수정을 통해 다음을 얻습니다.

^([a-zA-Z0-9](([a-zA-Z0-9-]){0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}$

또한보십시오:내 정규 표현식이 X에서는 작동하지만 Y에서는 작동하지 않는 이유는 무엇입니까?

관련 정보