bash 정규식 점 "." 문자가 일치하지 않습니다.

bash 정규식 점 "." 문자가 일치하지 않습니다.

제가 일치시키려는 문자열은 IP 주소입니다. 온라인에서 많은 예를 보았습니다. 그러나 정규식 규칙 간의 차이점과 관련이 있을 수도 있고 없을 수도 있는 내용이 누락된 것 같습니다. (PCRE, 어,??)

누락된 지점까지 분석하기 위해 일치시키려는 부분 IP 주소는 다음과 같습니다.

ip="255.255."

위의 IP와 일치시키려는 정규식은 다음과 같습니다.

^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?\.){2}

이것은 bash이므로 비교할 것이 있습니다.

[[ ${ip} =~ ^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?\.){2} ]] && echo "ok"

아, 이건 일치하지 않습니다.

내가 아는 한, 나는 그것을 피해갈 수 있다. 어떤 문자가 아니라 도트 문자와 일치하기를 원하기 때문입니다. (내가 아는 한 정규식에서 .는 무엇을 의미하는가?)

위의 설명을 설명하기 위해 점 앞의 이스케이프를 제거하면 이런 일이 발생합니다.

# ip="255.255."
# [[ ${ip} =~ ^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?.){2} ]] && echo "ok"
ok
# ip="255X255Y"
# [[ ${ip} =~ ^(25[0-5]|2[0-4][0-9]|[01]?[0-9] [0-9]?.){2} ]] && echo "ok"
ok

이 경우 IP 일치(일부)가 올바르지 않습니다.

왜 일치하지 않습니까?

# ip="255.255."
# [[ ${ip} =~ ^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?\.){2} ]] && echo "ok" || echo "nope"
nope

두 개의 그룹이 있으며 각 그룹은 "255"입니다. 이 부분은 아래와 같이 잘 일치합니다.

# ip="255."
# [[ ${ip} =~ ^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?\.) ]] && echo "ok" || echo "nope"
ok  

편집하다:내 문제를 해결할 수 있는 추가 정보:

방금 다음 사항을 확인했습니다.

# ip="172.15.11.10"
# [[ ${ip} =~ ^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?\.){2} ]] && echo "ok" || echo "nope"
ok
# ip="172.15."
# [[ ${ip} =~ ^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?\.){2} ]] && echo "ok" || echo "nope"
ok

다음 그룹화를 수행할 때:

# [[ ${ip} =~ ^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?\.){2} ]] && echo "ok" || echo "nope"
nope
# [[ ${ip} =~ ^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){2} ]] && echo "ok" || echo "nope"
ok

그러면 구분 기호 "점" 앞에 "숫자" 부분을 그룹화하면 문제가 해결됩니까?

# ip="255.255."
# [[ ${ip} =~ ^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){2} ]] && echo "ok" || echo "nope"
ok

나는 이것이 트릭을 수행할 것이라고 생각하는 경향이 있지만 아직 왜 그런지 이해하지 못합니다.

편집하다: IP 주소의 전체 정규식은 다음과 같습니다.

^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)

이것은 Jeff가 아래 답변에서 언급한 것과 동일합니다.

답변1

괄호가 잘못된 위치에 있습니다.

실패한 정규식에서는 옥텟 가능성을 교대로 결합합니다.

^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?\.)

...줄의 시작 부분과 일치하며 ^그 뒤에는 다음이 따릅니다.

  • 25[0-5] 또는
  • 2[0-4][0-9] 또는
  • [01]?[0-9][0-9]?\.

기간이 세 번째 가능한 교대에 어떻게 포함되는지 확인하세요. 이렇게 하면 정규 표현식이 초기 정규 표현식과 일치하게 되어 255후속 기간은 일치하지 않게 됩니다.

옥텟과 마침표가 반복되기를 원하므로 정규식을 다음과 같이 그룹화하십시오.

^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){2}

또는 다음과 같습니다:

^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$

...그래서 4개의 옥텟이 있습니다.

이렇게 하면 IP 주소가 한 줄에 자동으로 표시됩니다. 줄에서 IP 주소가 나타나는 위치가 중요하지 않은 경우 선행( ^) 및 후행( $) 앵커를 제거합니다.

grep --color=always -E ...Linux에서는 테스트 시 시각적인 도움을 제공하기 위해 다음과 같이 사용할 수 있습니다 .

$ ip=jeff-255.255.255.255-foo
$ echo "$ip" | grep --color=always -E '((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)'
제프-255.255.255.255-foo

... 255.255.255.255색상으로 표시됩니다.

관련 정보