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

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

이는 구문상 올바르지 않습니다.

#!/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

위의 구문은 끔찍합니다... 그래서 제 질문은 - 그것을 할 수 있는 방법이 있습니까?!=~

...그런 것 같아요 !~? 이것이 사실이라면 부정 규칙 lulz에 대해서는 이만큼입니다. 네, 테스트해봤는데 !~작동하지 않더군요...

답변1

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

[[ ! "string" =~ regex ]]

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

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

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

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 및 en_GB.UTF-8로케일에서는 0123456789 외에도 bash. 적어도 내 경우에는 모두 0부터 8까지의 십진수와 어떤 관계가 있지만 일반적으로 이것이 보장되지는 않습니다.[0-9]globasciiranges

반면에 는 이 10개만 일치 [[:digit:]]하며 [0123456789]모든 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]+약어가 있는지 여전히 궁금합니다 .

관련 정보