테스트를 사용하여 정규식을 부정하는 방법

테스트를 사용하여 정규식을 부정하는 방법

이는 구문상 잘못되었습니다.

#!/usr/bin/env bash

dimension="4x5"

if [[ "$dimension" !=~ '[0-9]x[0-9]' ]]; then
 echo 'wtf meng, the dimension needs an "x" in it.'
 return 1;
fi

위의 구문은 잘못되었습니다. 그래서 제 질문은 - 할 수 있는 방법이 있습니까?!=~

...그럴 것 같은데요 !~? 그것이 사실이라면 부정 규칙에 대한 내용은 이만큼입니다. 그렇군요.. 테스트해봤는데 !~역시 작동하지 않네요..

답변1

키워드 에 !=~or 연산자 가 없습니다 . 대신 비교 결과를 무효화하세요.!~[[

[[ ! "string" =~ regex ]]

주장 인용 과 관련하여 regex매뉴얼에는 다음과 같이 명시되어 있습니다.

패턴의 일부를 인용하여 인용된 부분을 문자열로 일치시킬 수 있습니다.

regex따라서 쉘 옵션이 compat31설정 되지 않은 한 정규식 부분을 인용해서는 안 됩니다.

shopt...compat31

[[설정된 경우 bash는 조건부 명령 =~연산자 에 대한 인용된 인수와 관련하여 동작을 버전 3.1의 동작으로 변경합니다.

주어진 예에서는 다음을 시도해 보십시오.

if [[ ! "$dimension" =~ ^[0123456789]+x[0123456789]+$ ]]; then
    printf '%s %s\n' "'$dimension'" 'is not a valid dimension.'
fi
  • regex으로 고정되어야 하며 ^...$, 그렇지 않으면 foo1x1fubar유효한 치수로 간주됩니다.

또한 입력 유효성 검사와 같은 범위를 사용하지 마십시오 0-9. 특히 많은 로케일에서와 같이 보안에 민감한 컨텍스트에서 삭제를 위한 경우 이러한 범위에는 역사적으로 그랬던 것보다 훨씬 더 많은 문자(또는 여러 문자로 구성된 요소를 대조하는 요소)가 포함됩니다. 여전히 C/POSIX 로케일에서 수행됩니다).

의 경우 =~여기서는 도움이 bash되지 globasciiranges않습니다. Ubuntu 19.10 및 로케일에서 0123456789 외에 1040개의 다른 문자와 일치하는 것을 en_GB.UTF-8발견했습니다 . 적어도 내 경우에는 모두 0에서 8까지의 십진수와 어떤 관계가 있지만 일반적으로 보장되지는 않습니다.bash[0-9]globasciiranges

반면에 [[:digit:]]and는 [0123456789]해당 10개에서만 일치하며 모든 POSIX 호환 시스템에서 사용해야 합니다.

sh다음과 같은 표준 구문과 와일드카드 패턴을 사용하여 이를 수행할 수도 있습니다 .

valid_geometry() case $1 in
  (*[!x0123456789]* | *x | x* | *x*x*) false;;
  (*x*) true;;
  (*) false;;
esac
if ! valid_geometry "$dimension"; then
   ...
fi

또는 다음 을 사용하여 ksh glob을 사용합니다( 및 에서도 bash -O extglob지원됨 bash) .[[extglob

if [[ $dimension != +([0123456789])x+([0123456789]) ]]; then
  ...
fi

답변2

좋아요, 이것이 작동하는 것 같습니다:

if [[ ! "$dimension" =~ [0-9]+x[0-9]+ ]]; then
 echo 'wtf meng, the dimension needs an "x" in it.'
 exit 1;
fi

그런데 왜 작은따옴표로 묶는 것이 작동하지 않는지 궁금합니다.

if [[ ! "$dimension" =~ '[0-9]+x[0-9]+' ]]; then
 echo 'wtf meng, the dimension needs an "x" in it.'
 exit 1;
fi

내 해결책은 다음과 같습니다.

dimension="3x5"

regex='[0-9]+x[0-9]+'

if [[ ! "$dimension" =~ $regex ]]; then
 echo 'wtf meng, the dimension needs an "x" in it.'
 exit 1;
fi

이제 작은따옴표를 사용하여 정규식을 인용할 수 있지만 [[ ]] 내에서 $regex를 참조할 때는 큰따옴표를 피해야 합니다. 그러나 ..의 약어가 있는지 여전히 궁금합니다 [0-9]+.

관련 정보