D 2.0
About Japanese Translation

Last update Sun Dec 19 23:27:28 2010

std.regex

正規表現 は、 非常に強力な文字列パターンマッチの道具です。 このライブラリで使用する正規表現言語は広く使われているものと基本的には同じですが、 いくつかの発展的な機能はわずかに違った挙動を示すことがあります。 参照としている標準規格は ECMA standard の正規表現の仕様です。

std.regex は、正しいUTFエンコードの文字列に対してのみ動作します。 UTF8 (char), UTF16 (wchar), UTF32 (dchar) が使用できます。 エンコーディングの正しさをチェックするには std.utf.validate() を使用して下さい。

以下の説明では、pattern[] 変数は 正規表現 を指します。attributes[] 変数は、正規表現の解釈を制御するフラグ文字列です。 以下の文字を 何文字か並べたものを指定することができます。

Attribute Characters
Attribute Action
g グローバル。文字列全体に対してマッチを繰り返す
i 大文字小文字を区別しない
m 複数行モード。改行文字を単なる文字としてもマッチするようになります

format[] には書式化文字列を含むことができます:

Formatting Characters
Format Replaced With
$$ $
$& マッチした部分文字列
$` マッチより前の部分の文字列
$' マッチより後の部分の文字列
$n n番目の括弧に対するマッチ。 n は 1..9 で、 数字が後に続いていない場合。
$nn nn番目の括弧に対するマッチ。nn は二桁の数字 01-99 です。nn番目のマッチが未定義だったり、 正規表現内の括弧による部分表現の個数よりも多かった場合、空文字列に置き換わります。

これ以外の $ はそのまま残ります。

Source:
std/regex.d

License:
Boost License 1.0.

Authors:
Walter Bright, Andrei Alexandrescu

References:
Wikipedia

string email;
Eメールアドレスを取り出す正規表現です

References:
How to Find or Validate an Email Address; RFC 2822 Internet Message Format

string url;
URLを取り出す正規表現です

struct Regex(E) if (is(E == Unqual!(E)));
Regex!(Unqual!(typeof(String.init[0]))) regex(String)(String pattern, string flags = null);
Regex は正規表現エンジンを格納します。Regex オブジェクトは文字列を指定して構築しますが、 これをパフォーマンスのために内部表現にコンパイルして保持しています。

型パラメータ E は正規表現によって認識される文字の型を指定します。 現在のところ、char, wchar, dchar をサポートします。正規表現パターンそのもののエンコーディングと、 マッチ対象のエンコーディングは同じでなければなりません。

このオブジェクトは、通常は regex 関数を使って構築します。 この場合、文字の型は自動的に推論されます。

Example:
2つの変数を宣言し、Regex オブジェクトを代入している例です。1つめは UTF-8 文字列にマッチし、2つめは UTF-32 文字列にマッチします。付け加えると、2つめにはグローバルマッチのオプションが設定されています。

auto r = regex("pattern");
auto s = regex(r"p[1-5]\s*"w, "g");

template __ctor(String)
Regex オブジェクトを構築します。パターンと attributes をコンパイルし、高速実行に向いた内部表現に変換します。

Parameters:
pattern 正規表現
attributes 属性 (g, i, m を指定できます)

Throws:
正規表現のコンパイルエラーがあれば Exception を投げます

const uint captures();
括弧による部分パターンの個数を返します。

struct RegexMatch(Range = string);
RegexMatch は、match 関数の結果を格納するオブジェクトです。 マッチ結果の情報や状態を保持しており、情報を取得したり次のマッチに進めたりすることができます。

Regex engine;
マッチに使う正規表現オブジェクトをget/setします

const bool empty();
void popFront();
RegexMatch!(Range) front();
typeof(this) save();
レンジの基本関数です。文字列内の検索を繰り返して次のマッチを取得します。

Example:
import std.stdio;
import std.regex;

void main()
{
    foreach(m; match("abcabcabab", regex("ab")))
    {
        writefln("%s[%s]%s", m.pre, m.hit, m.post);
    }
}
// 出力:
// [ab]cabcabab
// abc[ab]cabab
// abcabc[ab]ab
// abcabcab[ab]

Captures captures();
括弧で指定したサブマッチの情報を、 ランダムアクセスレンジとして取得します。 第一要素はマッチ全体を表します。

Example:
foreach (m; match("abracadabra", "(.)a(.)"))
{
    foreach (c; m.captures)
        write(c, ';');
    writeln();
}
// writes:
// rac;r;c;
// dab;d;b;

Range pre();
マッチした部分の前にある部分文字列を指すスライスを返します。

Range hit();
入力中の、マッチした部分を返します。

Range post();
マッチした部分の後ろに続く部分文字列を指すスライスを返します。

string toString();
hit を返します (変換が必要な場合は string に変換されます)

bool chr(ref size_t si, E c);
文字列 sthis にマッチするかどうかを返します

RegexMatch!(Range) match(Range, Engine)(Range r, Engine engine);
文字列に対して正規表現でマッチングを行います。この関数が、このモジュールの機能のメインのエントリポイントです。 match(input, regex) を呼び出すと RegexMatch オブジェクトが返り、 ("g"オプション付きの正規表現であれば) 全てのマッチを辿る処理に使うことができます。

Range replace(Range, Engine, String)(Range input, Engine regex, String format);
文字列を指定された正規表現で検索します。 最初に見つかったマッチを format から生成した文字列で置き換えます。正規表現に "g" (global) 属性が指定されていた場合は、 さらに処理を続け全てのマッチを置き換えます。

Parameters:
input 検索対象の文字列
regex 正規表現パターン
format 置換方法を表す書式化文字列

Returns:
結果の文字列

Example:
s = "ark rapacity";
assert(replace(s, regex("r"), "c") == "ack rapacity");
assert(replace(s, regex("r", "g"), "c") == "ack capacity");
置換書式では、マッチ内容を $&, $$, $', $`, .. 9 記法で参照することができます:

assert(replace("noon", regex("^n"), "[$&]") == "[n]oon");

Range replace(alias fun, Range, Regex)(Range s, Regex rx);
文字列を指定された正規表現で検索します。 みつかったマッチをそれぞれ fun に渡し、 その返値でマッチ部分を置き換えて返します。

Parameters:
s 検索対象の文字列
rx 正規表現パターン
fun 関数

Returns:
結果の文字列

Example:
文字 'a' と 'r' を大文字化します:
string baz(RegexMatch!(string) m)
{
    return std.string.toupper(m.hit);
}
auto s = replace!(baz)("Strap a rocket engine on a chicken.",
        regex("[ar]", "g"));
assert(s == "StRAp A Rocket engine on A chicken.");

struct Splitter(Range);
Splitter!(Range) splitter(Range, Regex)(Range r, Regex pat);
正規表現を区切り子として、 レンジを区切って返すレンジです。

Example:
auto s1 = ", abc, de,  fg, hi, ";
assert(equal(splitter(s1, regex(", *")),
    ["", "abc", "de", "fg", "hi", ""][]));