std.regexp
正規表現 は文字列のパターンマッチを行う強力な方法です。 正規表現の言語は 基本的にはよく使われているものと同じですが、 非常に高度な機能の挙動は幾つか違う点もあるかもしれません。std.regexp では、正しいUTF文字列が入力されたときの動作のみ保証されています。 文字列エンコードの正しさを調べるには、std.utf.validate() を使用してください。
以下の説明では、パターン pattern[] は常に 正規表現 を指します。 属性 attributes[] は 正規表現の解釈を 制御する文字列です。 以下の文字の 1文字以上の列になります:
属性 | 動作 |
---|---|
g | global; 全てのマッチを置換 |
i | 大文字小文字を区別しない |
m | 複数行を改行文字で区切られたものとして扱います |
format 文字列は以下の文字で構成されます:
書式指定 | 置換結果 |
---|---|
$$ | $ |
$& | マッチした部分文字列 |
$` | マッチより前の部分の文字列 |
$' | マッチより後の部分の文字列 |
$n | n番目の括弧に対するマッチ。 n は 1..9 で、 数字が後に続いていない場合。 |
$nn | nn番目の括弧に対するマッチ。 nn は二桁の数字 01-99 です。 nn番目のマッチが未定義だったり、 正規表現内の括弧による部分表現の個数よりも多かった場合、 空文字列に置き換わります。 |
これ以外の $ はそのまま残ります。
References:
Wikipedia
- string email;
- emailアドレスを取り出す正規表現です
- string url;
- urlを取り出す正規表現です
- class RegExpException: object.Exception;
- 正規表現コンパイルエラー時に創出される例外です
- string sub(string s, string pattern, string format, string attributes = null);
- 正規表現 pattern と属性 attributes
に対する文字列 s 中のマッチを探します。
各々のマッチ部分を format から生成される文字列に置き換えます。
Params:
string s 検索対象の文字列 string pattern 正規表現パターン string format 置換文字列フォーマット string attributes 正規表現の属性
Returns:
置換結果の文字列
Example:
文字 'a' を 'ZZ' に置き換えます。s = "Strap a rocket engine on a chicken." sub(s, "a", "ZZ") // 結果: StrZZp a rocket engine on a chicken. sub(s, "a", "ZZ", "g") // 結果: StrZZp ZZ rocket engine on ZZ chicken.
置き換え後の文字列では $&, $$, $', $`, .. 9 記法を使ってマッチ結果を参照できます:sub(s, "[ar]", "[$&]", "g") // 結果: St[r][a]p [a] [r]ocket engine on [a] chi
- string sub(string s, string pattern, string delegate(RegExp) dg, string attributes = null);
- 正規表現 pattern と属性 attributes
に対する文字列 s 中のマッチを探します。
各々のマッチ部分を delegate dg に渡し、
dg からの返値に置き換えます。
Params:
string s 検索対象の文字列 string pattern 正規表現パターン string delegate(RegExp) dg 置換操作を記述したdelegate string attributes 正規表現の属性
Returns:
置換結果の文字列
Example:
文字 'a' と 'r' のみを大文字化:s = "Strap a rocket engine on a chicken."; sub(s, "[ar]", delegate char[] (RegExp m) { return toupper(m.match(0)); }, "g"); // 結果: StRAp A Rocket engine on A chicken.
- int find(string s, string pattern, string attributes = null);
- 正規表現 pattern と属性 attributes に対する文字列 s 中の最初のマッチを探します。
Params:
string s 検索対象の文字列 string pattern 正規表現パターン string attributes 正規表現の属性
Returns:
マッチが見つかった s[] のインデックス。見つからなかった場合は -1。
Example:
auto s = "abcabcabab"; std.regexp.find(s, "b"); // マッチ。1を返す std.regexp.find(s, "f"); // マッチしない。-1を返す
- int rfind(string s, string pattern, string attributes = null);
- 正規表現 pattern と属性 attributes に対する文字列 s 中の最後のマッチを探します。
Params:
string s 検索対象の文字列 string pattern 正規表現パターン string attributes 正規表現の属性
Returns:
マッチが見つかった s[] のインデックス。見つからなかった場合は -1。
Example:
auto s = "abcabcabab"; rfind(s, "b"); // マッチ。9を返す rfind(s, "f"); // マッチしない。-1を返す
- string[] split(string s, string pattern, string attributes = null);
- 正規表現 pattern
を区切りとして用いて、文字列 s を文字列の配列へと分解します。
Params:
string s 検索対象の文字列 string pattern 正規表現パターン string attributes 正規表現の属性
Returns:
s へのスライスの配列
Example:
foreach (s; split("abcabcabab", "C.", "i")) { writefln("s = '%s'", s); } // 出力: // s = 'ab' // s = 'b' // s = 'bab'
- RegExp search(string s, string pattern, string attributes = null);
- 正規表現 pattern と属性 attributes に対する文字列 s 中の最初のマッチを探します。
Params:
string s 検索対象の文字列 string pattern 正規表現パターン string attributes 正規表現の属性
Returns:
見つかったら対応するRegExpオブジェクト、見つからなければnull
Example:
import std.stdio; import std.regexp; void main() { if (m; std.regexp.search("abcdef", "c")) { writefln("%s[%s]%s", m.pre, m.match(0), m.post); } } // 出力は: // ab[c]def
- class RegExp;
- RegExp は正規表現を扱うクラスです。
RegExp クラスは、grepやawk,sed,あるいはテキストエディタのようなプログラムに 文字列マッチング機能を追加するためのコアとなる機能を提供します。
- this(string pattern, string attributes = null);
- 新しい RegExp オブジェクトを作成します。pattern を、
属性 attributes で
高速実行のための内部形式へコンパイルします。
Params:
string pattern 正規表現文字列 string attributes 属性
Throws:
コンパイルエラーが発生すると RegExpError を投げます。
Example:
Declare two variables and assign to them a RegExp object:auto r = new RegExp("pattern"); auto s = new RegExp(r"p[1-5]\s*");
- static RegExp opCall(string pattern, string attributes = null);
- 新しい RegExp オブジェクトを作成します。
Params:
string pattern 正規表現文字列 string attributes 属性
Throws:
コンパイルエラーが発生すると RegExpError を投げます。
Example:
Declare two variables and assign to them a RegExp object:auto r = RegExp("pattern"); auto s = RegExp(r"p[1-5]\s*");
- RegExp search(string string);
int opApply(int delegate(inout RegExp) dg); - foreach ループの開始処理を行います
Returns:
search() returns instance of RegExp set up to search string[].
Example:
import std.stdio; import std.regexp; void main() { foreach(m; RegExp("ab").search("abcabcabab")) { writefln("%s[%s]%s", m.pre, m.match(0), m.post); } } // 出力は: // [ab]cabcabab // abc[ab]cabab // abcabc[ab]ab // abcabcab[ab]
- string match(size_t n);
- n 番目のマッチを取得します。
n==0 はマッチした部分文字列全体を意味し、n>0 は n番目の括弧で囲まれた部分表現を意味します。 n が括弧による部分表現の数よりも大きかった場合は、 null が返されます。
- string pre();
- マッチした部分文字列の前の部分を表すスライスが返されます
- string post();
- マッチした部分文字列の後ろの部分を表すスライスが返されます
- string[] split(string s);
- 正規表現を区切り文字列として使って、s
を文字列の配列へ分割します。
Returns:
sへのスライスの配列です。
- int find(string string);
- string 内から正規表現にマッチする位置を探します。
Returns:
マッチ箇所のindex。マッチしなかった場合は -1
- string[] match(string s);
- 文字列 s[] からマッチを探します
Returns:
global属性がセットされていれば、exec(s) と同じ結果を返します。 global属性がないときは、全てのマッチの配列を返します。
- alias opEquals;
- 文字列 s が this とマッチするか否かを返します。
- string replace(string s, string format);
- 正規表現と s
のマッチ箇所をさがし、
その箇所を対応する format による文字列へ置き換えます。
global属性がセットされている場合は全てのマッチを置き換え、そうでなければ最初のマッチを置き換えます。
Returns:
置換後の文字列
- string[] exec(string string);
- 文字列 string[] からマッチを探します
Returns:
マッチを表す string[] へのスライスの配列
- string[] exec();
- 最後に実行した exec(string) か exec() の検索を再実行し、
文字列中の次のマッチを探します。
Returns:
マッチを表す string[] へのスライスの配列
- int test(string s);
- 文字列 s[] からマッチを探します
Returns:
マッチした場合 非0、しなかった場合 0
Example:
import std.stdio; import std.regexp; import std.string; int grep(int delegate(char[]) pred, char[][] list) { int count; foreach (s; list) { if (pred(s)) ++count; } return count; } void main() { auto x = grep(&RegExp("[Ff]oo").test, std.string.split("mary had a foo lamb")); writefln(x); }
この例では 1 と表示されます。
- int test();
- 最後に実行した test(string) か test() の検索の続きを実行します
Returns:
マッチした場合 非0、しなかった場合 0
- int test(string s, int startindex);
- 文字列 s[] を startindex から始めて正規表現とのマッチをテストします
Returns:
マッチした場合 非0、しなかった場合 0
- string replace(string format);
- マッチを test() で見つけたあと、
この関数を呼ぶと format 文字列を使って
新しい文字列を生成して返します。
- string replaceOld(string format);
- replace(char[] format) と同様ですが、旧形式の書式指定コマンドを使います:
書式指定 説明 & マッチと置き換え \n n番目の括弧に対するマッチに置き換わる。n は 1..9 \c 文字 c と置き換え