正規表現の名前付きグループ
環境 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が標準で使えないのが、ちょっと以外だが、大概は対応している模様。