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

2つのグループがあり、各グループは「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]?\.

期間が3番目の可能なシフトにどのように含まれるかを確認してください。これにより、正規表現が初期正規表現と一致し、その後の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アドレスが1行に自動的に表示されます。行内の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色で表示されます。

関連情報