簡體   English   中英

用於匹配 IP 版本 6 地址的壓縮文本表示的 LEX 模式

[英]LEX Pattern for matching compressed textual representation of an IP version 6 address

我知道有很多關於堆棧溢出和其他正則表達式的帖子,包括 IPV6 地址的 LEX 模式。 它們似乎都不是真正完整的,並且確實有些要求不需要解析所有可能的地址格式。

我正在尋找 IP 版本 6 地址的 LEX 模式,僅適用於以壓縮文本形式表示的地址。 這種形式在RFC 5952 (以及可能的其他相關 RFC)的第 2.2 節中進行了描述,並且代表了所有可能的 IPv6 地址格式的一個相對較小的子集。

如果有人有一個經過良好測試或知道的,請轉發。

RFC 5952 §2.2沒有正式描述壓縮的 IPv6 地址形式。 RFC 5952 的目標是產生一種“規范的文本表示形式”; 也就是說,一組文本編碼與 IPv6 地址集具有一對一的關系。 第 2.2 節列舉了導致編碼選項的壓縮形式的幾個方面; 規范表示需要消除所有選項。

壓縮語法實際上在RFC 4291 §2.2的第 2 節中描述。 該語法很容易描述為正則表達式,盡管它有點煩人; 在包含兩個正則表達式的交集的語法中會更容易(例如,Ragel 提供了該運算符),但在這種情況下,簡單的可能性枚舉就足夠了。

如果您真的想將匹配限制為RFC 5952 §4.2中列出的規范表示,那么您有一個稍微艱巨的任務,因為要求 0 的壓縮運行必須是未壓縮地址中 0 的最長運行,或者如果有多個相同長度的最長運行,則第一次運行。

這可以通過對允許的 forms 進行更長的枚舉來實現,其中壓縮運行滿足“第一最長”約束。 但我真的不確定創建那個怪物有什么價值,因為 RFC 5952 非常清楚其意圖是限制由符合要求的應用程序生成的表示集(強調添加):

…[A]所有實現必須接受並能夠處理任何合法的 RFC4291格式。

由於正則表達式主要用於識別和解析輸入,go 似乎沒有必要編寫和驗證可能的規范模式列表。

符合RFC 4291 §2.2第 1 條的 IPv6 地址可以很容易地用 lex 語法描述:

piece      [[:xdigit:]]{1,4}
%%
{piece}(:{piece}){7}      { /* an uncompressed IPv6 address */ }

順便說一句,盡管出於上述相同的原因似乎沒有必要,但將{piece}限制為規范的 16 位表示非常簡單(僅小寫,沒有前導零):

piece    0|[1-9a-f][0-9a-f]{0,3}

復雜性來自第 2 節中的要求,即僅壓縮一次運行的 0。 編寫一個只允許省略一個數字的正則表達式很容易:

(({piece}:)*{piece})?::({piece}(:{piece})*)?

但是該公式不再將片段數限制為 8。編寫允許省略片段的正則表達式也相當容易,從而限制了字段的數量:

{piece}(:{piece}?){1,6}:{piece}|:(:{piece}){1,7}|({piece}:){1,7}:|::

需要的是這兩種模式的交集,加上未壓縮地址的模式。 但是,如前所述,沒有辦法在 (f)lex 中編寫交集。 所以我們最終列舉了各種可能性。 一個簡單的枚舉是初始未壓縮片段的數量:

(?x:  /* Flex's extended syntax allows whitespace and continuation lines */
    {piece}(:{piece}){7}
  | {piece}             ::{piece}(:{piece}){0,5}
  | {piece}:{piece}     ::{piece}(:{piece}){0,4}
  | {piece}(:{piece}){2}::{piece}(:{piece}){0,3}
  | {piece}(:{piece}){3}::{piece}(:{piece}){0,2}
  | {piece}(:{piece}){4}::{piece}(:{piece})?
  | {piece}(:{piece}){5}::{piece}
  | {piece}(:{piece}){0,6}::
  | ::{piece}(:{piece}){0,6}
  | ::
)

這仍然不包括在 IPv6 中嵌入 IPv4 地址的各種 forms,但如果需要,應該清楚如何添加這些地址。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM