附属書B 正規表現を用いたURI参照の構文解析 B. Parsing a URI Reference with a Regular Expression

4.3で示したとおり,共通URI構文は,URIの幾つかの形式の構成要素のあいまい性を解消するほどには十分ではない。4.3で示した"貪欲なアルゴリズム"はPOSIXの正規表現が使用するあいまい性解消の方法と同一なので,URI参照の存在する可能性のある四つの構成要素及び素片識別子を構文解析するために,正規表現を使用することは,自然であって共通的である。

As described in Section 4.3, the generic URI syntax is not sufficient to disambiguate the components of some forms of URI. Since the "greedy algorithm" described in that section is identical to the disambiguation method used by POSIX regular expressions, it is natural and commonplace to use a regular expression for parsing the potential four components and fragment identifier of a URI reference.

次に,URI参照をその構成要素に分割する正規表現を示す。

The following line is the regular expression for breaking-down a URI reference into its components.

      ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
       12            3  4          5       6  7        8 9

二行目の数字は,読みやすさを支援するためだけに与えられており,各々の部分式(すなわち,各々の対になった括弧の中の式)のための参照点を示す。部分式<n>に対して一致した値を$<n>として参照する。例えば,この式を次と照合させる。

The numbers in the second line above are only to assist readability; they indicate the reference points for each subexpression (i.e., each paired parenthesis). We refer to the value matched for subexpression <n> as $<n>. For example, matching the above expression to

      http://www.ics.uci.edu/pub/ietf/uri/#Related

その結果として,次の部分式との一致が得られる。

results in the following subexpression matches:

      $1 = http:
      $2 = http
      $3 = //www.ics.uci.edu
      $4 = www.ics.uci.edu
      $5 = /pub/ietf/uri/
      $6 = 
      $7 = 
      $8 = #Related
      $9 = Related

ここで、<undefined>は,構成要素が存在しないことを示す。この例では,問合せ構成要素がこの場合になる。そこで,四つの構成要素及び素片を次のとおりに決定できる。

where <undefined> indicates that the component is not present, as is the case for the query component in the above example. Therefore, we can determine the value of the four components and fragment as

      scheme    = $2
      authority = $4
      path      = $5
      query     = $7
      fragment  = $9

さらに,逆方向の処理を行う場合には,5.2のステップg)におけるアルゴリズムを使用して,URI参照を再生成できる。

and, going in the opposite direction, we can recreate a URI reference from its components using the algorithm in step 7 of Section 5.2.