정규식 테스트 사이트에서 테스트하면 아래 정규식이 정확합니다. 그러나 아래 코드는 어떠한 입력도 허용하지 않습니다. 내가 시도한 모든 것이 잘못되었습니다.
#!/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,}$