쉘 패턴 일치 및 산술 연산자(+ - * / %)

쉘 패턴 일치 및 산술 연산자(+ - * / %)

이는 간단해 보이지만 그렇지 않습니다.

[[ "1234+5678" =~ [0-9]+(\s*(\-|\*)\s*[0-9]+)* ]] && echo $?

1을 반환합니다 0. 그러나 빼기( -) 및 곱하기( *) 연산자만 허용되므로 실제로는 수행하면 안 됩니다. 또한 온라인에서 일부 정규식 도구를 찾아 이 패턴을 일치시켜 보았습니다. 결과는 빈 문자열입니다. (예상대로)

산문에서는 이확장하다정규식은 다음과 같습니다.

  • 번호 찾기 (필수)
  • 약간의 공백이 있는지 확인하십시오.
  • -연산자는 또는 a 여야 합니다.*
  • 공백이 있는지 다시 확인하십시오.
  • 다른 번호 찾기(연산자가 앞에 오는 경우 반드시 존재해야 함)

또한 괄호 안의 표현식 뒤에 나오는 별표는 두 번째부터 n번째 연산자 번호 쌍이 선택 사항임을 나타냅니다.

여기서 내 생각에 무슨 문제가 있습니까?

답변1

태그가 없으면 정규식(오른쪽 부분)은 다음을 수행할 수 있습니다.어떤 부분과도 일치끈. 따라서 변형이 와 일치합니다 1234. 요구 사항을 충족하려면 태그를 사용해야 합니다.

[[ "1234+5678" =~ ^[0-9]+(\s*(\-|\*)\s*[0-9]+)*$ ]] ; echo $?

더 짧게(원하는 경우):

[[ "1234+5678" =~ ^[0-9\ *-]+*$ ]] ; echo $?

답변2

귀하의 표현식은 첫 번째 숫자와 일치하므로 0을 반환합니다. 원하는 작업을 수행하도록 정규식을 고정합니다.

[[ "1234+5678" =~ ^[0-9]+( *(-|\*) *[0-9]+)*$ ]] && echo $?

참고 사항: (1) 인용이 필요하지 않으며 -(2) \sERE로 인식되지 않습니다.

답변3

[[ "1234+5678" =~ [0-9]+(\s*(\-|\*)\s*[0-9]+) ]] ; echo $?

*정규식 끝에 정규식 연산자를 사용하면 () 안의 표현식이 여러 번 반복될 수 있으며, 반복은 허용되지 않습니다. 따라서 처음부터 [0-9]+와 일치하고 나머지는 선택 사항입니다.

이를 제거 *하거나 a로 바꾸면 +표현식이 예상대로 반환됩니다.

또한 괄호 안의 표현식 뒤에 나오는 별표는 두 번째부터 n번째 연산자 번호 쌍이 선택 사항임을 나타냅니다.

이것이 오류입니다. 이는 *any 연산자가 옵션이라는 의미입니다. 연산자를 사용하세요 +!

글쎄, 이것은 대답은 아니지만 표현식을 사용하여 결과가 비어 있는지 확인할 수 있습니다.

echo "1234*5678"|sed 's/[0-9]\+\([ \*\-][0-9]\+\)*//'

관련 정보