takafumi blog

日々の勉強メモ

正規表現の名前付きグループ

環境   CentOS 7.0 Perl 5.16 PHP 5.6 Java 1.8.0nbsp;scala 2.11.6

恥ずかしながら、正規表現のグループに名前を付けれる事を今まで知らなかった。 ・・・という事で幾つかの言語の書き方を調べてみた。

結果は全部

abc, 123, def
abc, 123, def

で上が、通常のマッチした番号で、下が名前付きグループでの呼び出し例。

Perl
$x = 'abc123def';

# 通常
$x =~ /^([a-z]+)(\d+)([a-z]+)$/;
print "$1, $2, $3\n";

# 名前付き
$x =~ /^(?<one>[a-z]+)(?<two>\d+)(?<three>[a-z]+)$/;
print "$+{one}, $+{two}, $+{three}\n";

# version 5.10~対応
PHP
<?php
$x = 'abc123def';

// 通常
preg_match("/^([a-z]+)(\d+)([a-z]+)$/", $x, $m);
print "{$m[1]}, {$m[2]}, {$m[3]}\n" ;

// 名前付き
preg_match("/^(?P<one>[a-z]+)(?<two>\d+)(?'three'[a-z]+)$/", $x, $m);
print "{$m['one']}, {$m['two']}, {$m['three']}\n" ;

// ?P<>以外の書き方は version 5.2.2~対応
Java
String x = "abc123def";

// 通常
String regexp = "^([a-z]+)(\\d+)([a-z]+)$";
Matcher m = Pattern.compile(regexp).matcher(x);
m.find();
System.out.println(m.group(1) + ", " + m.group(2) + ", " + m.group(3));

// 名前付き
String regexp2 = "^(?<one>[a-z]+)(?<two>\\d+)(?<three>[a-z]+)$";
Matcher m2 = Pattern.compile(regexp2).matcher(x);
m2.find();
System.out.println(m2.group("one") + ", " + m2.group("two") + ", " + m2.group("three"));

// version 1.7~対応
Scala
val x = "abc123def";

// 通常
val pattern = "^([a-z]+)(\\d+)([a-z]+)$".r;
x match {
    case pattern(a1, a2, a3) => println(a1 + ", " +  a2 + ", " + a3);
}

// 名前付き
val pattern2 = "^(?<one>[a-z]+)(?<two>\\d+)(?<three>[a-z]+)$".r;
x match {
    case pattern2(one,  two, three) => println(one + ", " +  two + ", " + three);
}
Javascript

javascritpは・・・標準ではない? ただXRegExpを導入すればできるようだ。 http://xregexp.com/


javascriptが標準で使えないのが、ちょっと以外だが、大概は対応している模様。