修飾子
一致する文字がいくつ並んでいるのか、前もってわからないときがあります。このような場合に対応するため、正規表現では修飾子の概念をサポートしています。修飾子を使用すると、一致と判断させる場合の、指定要素の出現回数を指定できます。
次の表に、修飾子とその意味を一覧します。
文字 | 説明 |
---|---|
* | 直前のサブ式の 0 回以上の繰り返しに一致します。たとえば、'zo*' は "z" および "zoo" に一致します。* は {0,} と同じ意味になります。 |
+ | 直前のサブ式の 1 回以上の繰り返しに一致します。たとえば、'zo+' は "zo" および "zoo" には一致しますが、"z" には一致しません。+ は {1,} と同じ意味になります。 |
? | 直前のサブ式の 0 回または 1 回の繰り返しに一致します。たとえば、'do(es)?' は "do" および "does" に一致します。? は {0,1} と同じ意味になります。 |
{n} | n は負でない整数です。ちょうど n 回の繰り返しに一致します。たとえば、'o{2}' は "Bob" の 'o' には一致しませんが、"food" の2 つの 'o' には一致します。 |
{n,} | n は負でない整数です。n 回以上の繰り返しに一致します。たとえば、'o{2,}' は "Bob" の 'o' には一致しませんが、"foooood" のすべての 'o' には一致します。'o{1,}' は 'o+' と同じ意味になります。また、'o{0,}' は 'o*' と同じ意味になります。 |
{n,m} | m および n は負でない整数です。ここで n <= m が成立します。n 回以上 m 回以下の繰り返しに一致します。たとえば、'o{1,3}' は "fooooood" の先頭から 3 つの 'o' に一致します。'o{0,1}' は 'o?' と同じ意味になります。カンマと数字の間にはスペースを挿入しないことに注意してください。 |
入力ドキュメントのサイズが大きくなると章番号が 9 を超えることも考えられるため、2 桁や 3 桁の章番号にも対応することが必要です。修飾子を使うとそれが可能になります。次の JScript 正規表現は、任意の桁数を持つ章見出しに一致します。
/Chapter [1-9][0-9]*/
次の VBScript 正規表現は同じ意味の一致処理を実行します。
"Chapter [1-9][0-9]*"
修飾子が範囲表現の直後に指定されていることに注意してください。これにより、0 ~ 9 の数字を指定している範囲表現全体に対して、修飾子が適用されます。
ここでは、'+' 修飾子は使用していません。これは、2 桁目以降の数字が必ずしも必要ではないためです。また、'?' 文字も使用していません。これは、? を使用すると章番号が最大 2 桁に制限されてしまうためです。ここでは、'Chapter' とスペースに続く 1 桁以上の数字に一致させるものとします。
章番号が 99 章以下に限定される場合は、次の JScript 表現を使って 1 桁以上 2 桁以下の数字を指定できます。
/Chapter [0-9]{1,2}/
VBScript では次の正規表現を使用します。
"Chapter [0-9]{1,2}"
上記の表現では、99 より大きな章番号が存在する場合でも、最初の 2 桁だけに一致してしまいます。また、別のユーザーが Chapter 0 を作成した場合、これにも一致してしまいます。2 桁の数字だけに一致するように改善すると、JScript 表現の指定は次のようになります。
/Chapter [1-9][0-9]?/
または
/Chapter [1-9][0-9]{0,1}/
VBScript の場合は、次のようになります。
"Chapter [1-9][0-9]?"
または
"Chapter [1-9][0-9]{0,1}"
'*
'、'+'、'?' の各修飾子はすべて、最大一致として動作します。つまり、できるだけ広い範囲のテキストに一致しようとします。そのため予想外の結果となることがあります。場合によっては、最小一致が必要となります。
たとえば、HTML ドキュメントで H1 タグで囲まれた章見出しを検索する場合を考えてみます。そのようなテキストは、ドキュメント内では次のように記述されます。
<H1>Chapter 1 Introduction to Regular Expressions</H1>
次の表現は、H1 タグの開始記号 (<) から終了記号 (>) までのすべてのテキストに一致します。
/<.*>/
VBScript 正規表現の場合は、次のようになります。
"<.*>"
H1 の開始タグだけに一致させる場合、次の最小一致による表現を使用します。
/<.*?>/
または
"<.*?>"
"*"、"+"、"?" の各修飾子の後に "?" を付けると、最大一致から最小一致へと、表現の動作が変換されます。