D言語における正規表現

D言語の正規表現でテンプレート引数付きの replace を用いると、グループ化した部分表現(正規表現の中の()で囲まれた部分)にマッチした文字列に演算を施した上で置き換えるプログラムが簡単に作成できます。下記の例では、rule で部分表現にマッチした文字列を操作しています。
尚、r”…” は、生文字列リテラル(raw string literal)を表します。

regexp.d

import std.array:array;
import std.conv, std.regex, std.stdio;

void main() {
  "1-2-3,4-5-6,7-8-9".match(regex("([0-9])-([0-9])-([0-9])")).array.writeln;
  "1-2-3,4-5-6,7-8-9".match(regex("([0-9])-([0-9])-([0-9])", "g")).array.writeln;

  if (auto m = "1-2-3,4-5-6,7-8-9".match(regex("([0-9])-([0-9])-([0-9])"))) {
    writeln(m.captures[0], ",", m.captures[1], ",", m.captures[2], ",", m.captures[3]);
  }

  foreach (m; "1-2-3,4-5-6,7-8-9".match(regex("([0-9])-([0-9])-([0-9])", "g"))) {
    writeln(m.captures[0], ",", m.captures[1], ",", m.captures[2], ",", m.captures[3]);
  }

  "1-2-3,4-5-6,7-8-9".replace(regex("([0-9])-([0-9])-([0-9])"), "$3-$2-$1").writeln;
  "1-2-3,4-5-6,7-8-9".replace(regex("([0-9])-([0-9])-([0-9])", "g"), "$3-$2-$1").writeln;

  auto text = "1+2,3+4,5+6";
  auto regexp = regex(r"([0-9]+)\+([0-9]+)", "g");
  //auto regexp = regex("([0-9]+)\\+([0-9]+)", "g");
  auto rule = (Captures!string captures) => (captures[1].to!int + captures[2].to!int).to!string;
  text.replace!rule(regexp).writeln;
}

実行結果

[["1-2-3", "1", "2", "3"]]
[["1-2-3", "1", "2", "3"], ["4-5-6", "4", "5", "6"], ["7-8-9", "7", "8", "9"]]
1-2-3,1,2,3
1-2-3,1,2,3
4-5-6,4,5,6
7-8-9,7,8,9
3-2-1,4-5-6,7-8-9
3-2-1,6-5-4,9-8-7
3,7,11

参考資料

1.D言語 – 正規表現
2.D Programming Language – Regular expressions
3.D Programming Language – std.regex

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中