次の表に、正規表現に対して設定できる 5 種類のフラグを示します。 各フラグには正規表現オブジェクトのプロパティとしてアクセスできます。
フラグ
|
プロパティ
|
説明
|
g
|
global
|
複数箇所に一致します。
|
i
|
ignoreCase
|
一致の判定において大文字と小文字を区別しません。
A
~
Z
および
a
~
z
の文字に適用されますが、
É
や
é
などの拡張文字には適用されません。
|
m
|
multiline
|
このフラグを設定した場合、
$
および
^
はそれぞれ行末と行頭にも一致します。
|
s
|
dotall
|
このフラグを設定した場合、
.
(ドット)は改行文字(
¥n
)にも一致します。
|
x
|
extended
|
正規表現の拡張機能を有効にします。 パターンの一部と見なされない空白を正規表現の中に挿入できるようになります。 これにより、正規表現コードの読みやすさを向上できます。
|
これらのプロパティは読み取り専用です。 次のように、正規表現変数を設定する際には、フラグ(
g
、
i
、
m
、
s
、
x
)を設定できます。
var re:RegExp = /abc/gimsx;
しかし、名前付きプロパティの値を直接設定することはできません。 例えば、次のコードではエラーが発生します。
var re:RegExp = /abc/;
re.global = true; // This generates an error.
デフォルトでは、正規表現の宣言内で指定しない限りフラグは設定されず、対応する各プロパティの値は
false
となります。
正規表現には上記の他にも、次の 2 つのプロパティがあります。
g(global)フラグ
g
(
global
)フラグを設定しない場合、正規表現が複数の場所に一致することはありません。例えば、次の正規表現には
g
フラグを設定していないので、
String.match()
メソッドは一致したサブストリングを 1 つしか返しません。
var str:String = "she sells seashells by the seashore.";
var pattern:RegExp = /sh\w*/;
trace(str.match(pattern)) // output: she
次のように
g
フラグを設定すると、
Sting.match()
メソッドは複数の一致箇所を返します。
var str:String = "she sells seashells by the seashore.";
var pattern:RegExp = /sh\w*/g;
// The same pattern, but this time the g flag IS set.
trace(str.match(pattern)); // output: she,shells,shore
i(ignoreCase)フラグ
正規表現の一致を判定する際、デフォルトでは大文字と小文字が区別されますが、
i
(
ignoreCase
)フラグを設定した場合は大文字と小文字が区別されません。例えば、次の正規表現に含まれている小文字の
s
は、ストリングの先頭にある大文字の
S
には一致しません。
var str:String = "She sells seashells by the seashore.";
trace(str.search(/sh/)); // output: 13 -- Not the first character
この正規表現に
i
フラグを設定すると、大文字の
S
にも一致するようになります。
var str:String = "She sells seashells by the seashore.";
trace(str.search(/sh/i)); // output: 0
i
フラグによって大文字と小文字が無視されるのは、
A
~
Z
および
a
~
z
文字についてのみであり、
É
や
é
では無視されません。
m(multiline)フラグ
m
(
multiline
)フラグを設定しない場合、
^
はストリングの先頭に、
$
はストリングの末尾に一致します。
m
フラグを設定した場合、これらの文字はそれぞれ行頭と行末にも一致します。次の例では、ストリング内に改行文字が含まれています。
var str:String = "Test\n";
str += "Multiline";
trace(str.match(/^\w*/g)); // Match a word at the beginning of the string.
正規表現に
g
(
global
)フラグを設定していても、
^
に一致する場所は 1 つ(ストリングの先頭)しか存在しないので、
match()
メソッドが返すサブストリングは 1 つだけです。したがって、結果の出力は次のようになります。
Test
次の例も同じコードですが、今度は
m
フラグを設定しています。
var str:String = "Test\n";
str += "Multiline";
trace(str.match(/^\w*/gm)); // Match a word at the beginning of lines.
この場合、出力にはそれぞれの行頭にある単語が含まれます。
Test,Multiline
行末を示す文字は、
¥n
だけです。次の文字は行末と見なされません。
s(dotall)フラグ
s
(
dotall
または dot all)フラグが設定されない場合、正規表現パターンのドット(
.
)は改行文字(
¥n
)に一致しません。したがって、次の例では一致する場所がありません。
var str:String = "<p>Test\n";
str += "Multiline</p>";
var re:RegExp = /<p>.*?<\/p>/;
trace(str.match(re));
ただし、
s
フラグを設定すると、ドットが改行文字にも一致するようになります。
var str:String = "<p>Test\n";
str += "Multiline</p>";
var re:RegExp = /<p>.*?<\/p>/s;
trace(str.match(re));
この場合は、
<p>
タグに囲まれたサブストリング全体(改行文字を含む)に一致します。
<p>Test
Multiline</p>
x(extended)フラグ
正規表現は解読が困難になる場合があります。特に、メタ文字やメタシーケンスを多用した正規表現は難解になる場合があります。 次に、例を示します。
/<p(>|(\s*[^>]*>)).*?<\/p>/gi
正規表現に
x
(
extended
)フラグを設定した場合、パターン内に入力した空白文字がすべて無視されます。例えば、次の正規表現は前の例と同等です。
/ <p (> | (\s* [^>]* >)) .*? <\/p> /gix
x
フラグを設定している場合に空白文字の一致を調べるには、その空白文字の直前に円記号を付けます。例えば、次の 2 つの正規表現は同等です。
/foo bar/
/foo \ bar/x
lastIndex プロパティ
lastIndex
プロパティは、ストリング内で次回の検索を開始するインデックス位置を示します。このプロパティは、
exec()
および
test()
メソッドの呼び出しに対して
g
フラグを
true
に設定した場合に有効です。例えば、次のようなコードがあるとします。
var pattern:RegExp = /p\w*/gi;
var str:String = "Pedro Piper picked a peck of pickled peppers.";
trace(pattern.lastIndex);
var result:Object = pattern.exec(str);
while (result != null)
{
trace(pattern.lastIndex);
result = pattern.exec(str);
}
lastIndex
プロパティは、デフォルトでは 0(ストリングの先頭から検索を開始)に設定されていますが、検索を実行するたびに、一致した場所に続くインデックス位置に設定されます。 したがって、前の例で示したコードの出力は次のようになります。
0
5
11
18
25
36
44
global
フラグを
false
に設定している場合、
exec()
および
test()
メソッドでは
lastIndex
プロパティを使用しません。
String クラスの
match()
、
replace()
、
search()
の各メソッドでは、検索処理を常にストリングの先頭から実行します。呼び出しに使用する正規表現の
lastIndex
プロパティにどのような値を設定しても影響はありません(ただし、
match()
メソッドを呼び出すと
lastIndex
には 0 が設定されます)。
lastIndex
プロパティを設定することで、ストリング内で正規表現による検索を開始する位置を調整できます。
source プロパティ
source
プロパティは、正規表現の中でパターンを定義する部分のストリングを示します。次に、例を示します。
var pattern:RegExp = /foo/gi;
trace(pattern.source); // foo