이는 간단해 보이지만 그렇지 않습니다.
[[ "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) \s
ERE로 인식되지 않습니다.
답변3
[[ "1234+5678" =~ [0-9]+(\s*(\-|\*)\s*[0-9]+) ]] ; echo $?
*
정규식 끝에 정규식 연산자를 사용하면 () 안의 표현식이 여러 번 반복될 수 있으며, 반복은 허용되지 않습니다. 따라서 처음부터 [0-9]+와 일치하고 나머지는 선택 사항입니다.
이를 제거 *
하거나 a로 바꾸면 +
표현식이 예상대로 반환됩니다.
또한 괄호 안의 표현식 뒤에 나오는 별표는 두 번째부터 n번째 연산자 번호 쌍이 선택 사항임을 나타냅니다.
이것이 오류입니다. 이는 *
any 연산자가 옵션이라는 의미입니다. 연산자를 사용하세요 +
!
글쎄, 이것은 대답은 아니지만 표현식을 사용하여 결과가 비어 있는지 확인할 수 있습니다.
echo "1234*5678"|sed 's/[0-9]\+\([ \*\-][0-9]\+\)*//'