bash를 사용한 정규식 대괄호 표현식

bash를 사용한 정규식 대괄호 표현식

영숫자, 밑줄, 마침표, 대시 및 더하기 기호가 포함된 사용자 입력만 허용하는 정규식을 작성하고 싶습니다.

Bash 스크립트에는 다음이 있습니다.

VALID="^[0-9a-zA-Z_\.\-\+]+$"
THE_INPUT=$1
if [[ ! $THE_INPUT =~ $VALID ]]; then
    echo "ERROR"
    exit 1  
fi

사용자가 - 를 사용하여 입력할 때 이것이 작동하지 않는 이유는 무엇입니까?

사용자 입력 예:

  1. 훌륭한 음식.png

    나. 오류 발생

  2. 좋아요_+음식.png

    나. 오류가 발생하지 않습니다.

답변1

[0-9a-zA-Z_\.\-\+]POSIX 기본 또는 확장 정규 표현식의 대괄호 표현식 일치:

  • 0-90: 및 사이 범위의 데이터 정렬 요소(단일 문자일 필요도 없습니다!) 9(로케일에 따라 무엇이든 될 수 있으므로 C/ POSIX로케일 외부의 입력 유효성 검사에 사용하면 안 됩니다)
  • a-zA-Z: ato z및 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:]]##'

zshPCRE도 지원되며 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 이외의 멀티바이트 문자 집합을 지원하지 않으며 $inputUTF-8이 유효하지 않은 경우 위의 내용은 UTF-8 로케일에서 오류를 보고합니다.

C 로케일에서는 s 및 밑줄과 일치하는 VALID='^[\w.+-]\z'를 사용할 수도 있습니다.\walnum


¹ awk는 확장 정규 표현식을 사용한다는 점에서 예외이지만 \대괄호 표현식에서는 여전히 특별합니다.적어도 일부 구현에서는.

답변2

일반적으로 정규식에서 -문자 클래스 블록의 문자는 범위를 의미합니다(예 [a-z]:아니요범위를 암시한다는 것은 문자 클래스 설명자의 맨 끝에 하이픈을 넣는 것입니다. 귀하의 스크립트에서 이 작업을 수행하면 원하는 대로 작동하는 것 같습니다.

VALID="^[0-9a-zA-Z_\.\+\-]+$"

그러므로:

$ ./741634.sh parameter/with/slashes
ERROR
$ ./741634.sh parameter-with-dashes
$

관련 정보