제가 일치시키려는 문자열은 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
색상으로 표시됩니다.