영숫자, 밑줄, 마침표, 대시 및 더하기 기호가 포함된 사용자 입력만 허용하는 정규식을 작성하고 싶습니다.
Bash 스크립트에는 다음이 있습니다.
VALID="^[0-9a-zA-Z_\.\-\+]+$"
THE_INPUT=$1
if [[ ! $THE_INPUT =~ $VALID ]]; then
echo "ERROR"
exit 1
fi
사용자가 - 를 사용하여 입력할 때 이것이 작동하지 않는 이유는 무엇입니까?
사용자 입력 예:
훌륭한 음식.png
나. 오류 발생
좋아요_+음식.png
나. 오류가 발생하지 않습니다.
답변1
[0-9a-zA-Z_\.\-\+]
POSIX 기본 또는 확장 정규 표현식의 대괄호 표현식 일치:
0-9
0
: 및 사이 범위의 데이터 정렬 요소(단일 문자일 필요도 없습니다!)9
(로케일에 따라 무엇이든 될 수 있으므로C
/POSIX
로케일 외부의 입력 유효성 검사에 사용하면 안 됩니다)a-zA-Z
:a
toz
및 to 와A
동일합니다Z
._\.
:밑줄, 백슬래시 또는 마침표:\-\
\
: 와 사이에 정렬된 요소를 대조합니다\
. 어쩌면 그럴지도\
모르지만, 당신은 결코 알 수 없습니다.\+
: 다시 백슬래시를 입력하고+
.
\
대괄호 표현식에서는 특별하지 않습니다 .
set 에 리터럴을 포함하려면 리터럴 을 마지막이나 첫 번째(또는 음수 세트에서는 바로 뒤에) -
배치해야 합니다 .^
bash는 POSIX 확장 정규식을 =~
연산자로 사용합니다.
원하는 곳은 다음과 같습니다.
VALID='^[0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_.+-]+$'
로 전환할 수 있는 옵션이 있는 경우 zsh
확장된 glob 연산자를 사용할 수 있습니다. 이는 다양한 구문과 덜 놀라운 동작을 갖춘 확장 정규식의 상위 집합이며 정규식과 달리 텍스트가 아닌 항목을 처리할 수 있습니다.
set -o extendedglob
VALID='[0-9a-zA-Z_+.-]##'
if [[ $input != $~VALID ]]; then...
( 여기의 ~
내용은 $VALID
문자 그대로의 의미가 아닌 패턴으로 간주됩니다.)
또한 로케일에 분류된 모든 문자 및 의 문자와 일치하는 [:WORD:]
문자 클래스 도 있습니다 .alnum
$WORDCHARS
C 언어 환경에서는 다음을 정의 WORDCHARS='.-+_'
하고 사용할 수 있습니다.
set -o extendedglob # needed for ##, the equivalent of ERE +.
VALID='[[:WORD:]]##'
zsh
PCRE도 지원되며 PCRE에는 대괄호 표현식도 있습니다.
zmodload zsh/pcre
VALID='^[0-9a-zA-Z._+-]+\z'
if [[ ! $input -pcre-match $VALID ]]; then...
또는 =~
ERE 대신 PCRE를 사용하십시오.
set -o rematchpcre
VALID='^[0-9a-zA-Z._+-]+\z'
if [[ ! $input =~ $VALID ]]; then...
거기 에서도 VALID='^[0-9a-zA-Z\-._+]+\z'
사용할 수 있습니다.
PCRE는 UTF-8 이외의 멀티바이트 문자 집합을 지원하지 않으며 $input
UTF-8이 유효하지 않은 경우 위의 내용은 UTF-8 로케일에서 오류를 보고합니다.
C 로케일에서는 s 및 밑줄과 일치하는 VALID='^[\w.+-]\z'
를 사용할 수도 있습니다.\w
alnum
¹ awk는 확장 정규 표현식을 사용한다는 점에서 예외이지만 \
대괄호 표현식에서는 여전히 특별합니다.적어도 일부 구현에서는.
답변2
일반적으로 정규식에서 -
문자 클래스 블록의 문자는 범위를 의미합니다(예 [a-z]
:아니요범위를 암시한다는 것은 문자 클래스 설명자의 맨 끝에 하이픈을 넣는 것입니다. 귀하의 스크립트에서 이 작업을 수행하면 원하는 대로 작동하는 것 같습니다.
VALID="^[0-9a-zA-Z_\.\+\-]+$"
그러므로:
$ ./741634.sh parameter/with/slashes
ERROR
$ ./741634.sh parameter-with-dashes
$