일치 표현식에 정규 표현식 리터럴을 작성하는 방법은 무엇입니까?

일치 표현식에 정규 표현식 리터럴을 작성하는 방법은 무엇입니까?

이 질문은 정규식을 작성하는 올바른 방법에 관한 것입니다.단어bash에서 일치하는 표현식에서.

zsh에서는 예상대로 다음 일치가 성공합니다.

% [[ ' 123 ' =~ '^ [0-9]+ $' ]]; echo $?
0

Bash에서는 그렇지 않습니다.

$ [[ ' 123 ' =~ '^ [0-9]+ $' ]]; echo $?
1

나는 이 게임이 bash에서 성공적으로 작동한다는 것을 알고 있습니다.

$ ( regexp='^ [0-9]+ $'; [[ ' 123 ' =~ $regexp ]]; echo $? )
0

...하지만 정규식을 중간 변수에 할당해야 합니다.


내 질문은: 임의의 정규 표현식을 작성하는 방법입니다.단어bash의 일치 표현식에서?

답변1

Bash 참조 매뉴얼에서 제안한 대로 변수에 넣는 것이 더 좋습니다.3.2.4.2 조건부 구성:

쉘 변수에 정규식을 저장하는 것은 쉘 특정 문자를 인용할 때 문제를 방지하는 유용한 방법인 경우가 많습니다. 때로는 따옴표를 사용하지 않고 정규식을 문자 그대로 지정하거나 셸의 따옴표 제거에 주의하면서 정규식에서 사용되는 따옴표를 추적하는 것이 어렵습니다. 쉘 변수를 사용하여 패턴을 저장하면 이러한 문제를 줄일 수 있습니다.

그러나 이를 Bash 확장 테스트에 직접 작성하려면 따옴표를 제거하고 공백을 이스케이프해야 합니다.

$ [[ ' 123 ' =~ ^\ [0-9]+\ $ ]]; echo $?
0

답변2

Bash에서 표준 답변은 다음과 같습니다.변수 사용

$ reg='^ [0-9]+ $'
$ [[ ' 123 ' =~ $reg ]]; echo $?

이는 공백, 백슬래시 및 기타 여러 항목과 함께 작동합니다.

$ reg='^ 12\3 $'
$ [[ ' 12\3 ' =~ $reg ]]; echo $?
0

다음과 같이 쓰고 싶다면단어당신은 플레이해야합니다 (주의 깊은) 그리고 인용했습니다.
인용을 하셔야 합니다부분리터럴이어야 하며 정규식으로 해석되어야 하는 부분은 따옴표 없이 그대로 두어야 합니다. 공간을 인용해야 합니다. 여기서는 백슬래시가 사용됩니다.

$ [[ ' 123 ' =~ ^\ [0-9]+\ $ ]]; echo $?
0

여기에는 큰따옴표를 사용하세요.

$ [[ ' 123 ' =~ ^" "[0-9]+" "$ ]]; echo $?

그러나 "따옴표"는 백슬래시와 같은 문자로 인해 매우 지저분해질 수 있습니다.

$ [[ ' 12\3 ' =~ ^" "[0-9]+"\\"[0-9]+" "$ ]]; echo $?
0

더 쉽고 안전함:

$ reg='^ [0-9]+\\[0-9]+ $'
$ [[ ' 12\3 ' =~ $reg ]]; echo $?
0

그리고 아니요, 이 작업을 수행하려면 하위 쉘이 필요하지 않습니다(질문의 대괄호).

$ reg='^ [0-9]+\\[0-9]+ $'; [[ ' 12\3 ' =~ $reg ]]; echo $?

예, 짜증나는 것처럼 보일 수도 있습니다. 예, 제공하신 명령은 zsh에서 실행됩니다.

$ [[ ' 123 ' =~ '^ [0-9]+ $' ]]; echo $?
0

그러나 인용은 항상 문제입니다(모든 쉘에서). 백슬래시는 어떻게 되나요? :

% [[ ' 12\3 ' =~ ' 12\3 ' ]]; echo $?
zsh: failed to compile regex: Invalid back reference
1


% [[ ' 12\3 ' =~ '^ [0-9]+\\3 $' ]]; echo $?
0

더블! 완전한 것은 아니고:단어.

관련 정보