列(リスト)正規表現は既によく知られたものです。セット正規表現の応用例は、次の記事で述べています。
ここでは、バッグ(マルチセット)正規表現の例を挙げておきましょう。
XHTMLのheadの内容を単純化して、title, meta, linkだけに限定すると:
- titleは1回だけ必ず出現する。
- metaとlinkは何回(0回でも)出現してもよい。
- title, meta, linkの出現順序はどうでもよい。
となるでしょう。この内容モデルは、通常の列正規表現により ((meta|link)*, title, (meta|link)*)
と書くこともできますが、「出現順序はどうでもよい」なら、列(リスト)ではなくてバッグと考えれば、(title, link*, meta*)
という単純な正規表現でOK。記号「,」だと順序があるように思えるなら、(title & link* & meta*)
とでもすればいいでしょう(実はこの記法、SGMLへの先祖返り)。
DublinCoreメタデータ項目の出現パターンなども、列よりはバッグと考えたほうが自然です。
(続く)