std.regex
正規表現 は、
非常に強力な文字列パターンマッチの道具です。
このライブラリで使用する正規表現言語は広く使われているものと基本的には同じですが、
いくつかの発展的な機能はわずかに違った挙動を示すことがあります。
参照としている標準規格は
ECMA
standard の正規表現の仕様です。
std.regex は、正しいUTFエンコードの文字列に対してのみ動作します。
UTF8 (
char), UTF16 (
wchar), UTF32 (
dchar) が使用できます。
エンコーディングの正しさをチェックするには
std.utf.validate() を使用して下さい。
以下の説明では、
pattern[] 変数は
正規表現 を指します。
attributes[] 変数は、正規表現の解釈を制御するフラグ文字列です。
以下の文字を
何文字か並べたものを指定することができます。
Attribute CharactersAttribute | Action |
g | グローバル。文字列全体に対してマッチを繰り返す |
i | 大文字小文字を区別しない |
m | 複数行モード。改行文字を単なる文字としてもマッチするようになります |
format[] には書式化文字列を含むことができます:
Formatting CharactersFormat | 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
- Eメールアドレスを取り出す正規表現です
References:
How to Find or Validate an
Email Address; RFC
2822 Internet Message Format
- 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");
- Regex オブジェクトを構築します。パターンと attributes
をコンパイルし、高速実行に向いた内部表現に変換します。
Parameters:
pattern |
正規表現 |
attributes |
属性 (g, i, m を指定できます) |
Throws:
正規表現のコンパイルエラーがあれば Exception を投げます
- 括弧による部分パターンの個数を返します。
struct
RegexMatch(Range = string);
- RegexMatch は、match 関数の結果を格納するオブジェクトです。
マッチ結果の情報や状態を保持しており、情報を取得したり次のマッチに進めたりすることができます。
- マッチに使う正規表現オブジェクトを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);
}
}
- 括弧で指定したサブマッチの情報を、
ランダムアクセスレンジとして取得します。
第一要素はマッチ全体を表します。
Example:
foreach (m; match("abracadabra", "(.)a(.)"))
{
foreach (c; m.captures)
write(c, ';');
writeln();
}
- マッチした部分の前にある部分文字列を指すスライスを返します。
- 入力中の、マッチした部分を返します。
- マッチした部分の後ろに続く部分文字列を指すスライスを返します。
- hit を返します (変換が必要な場合は string に変換されます)
bool
chr(ref size_t
si, E
c);
- 文字列 s が this にマッチするかどうかを返します
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", ""][]));