正規表現の名前付きなマッチを覚えました。
>> ret = '直通特急 阪神梅田行 18:29 発 3番のりば'. match(/(?<type>.+) (?<dest>.+)行 (?<dep_time>.+)発 /) => #<MatchData "直通特急 阪神梅田行 18:29 発 " type:"直通特急" dest:"阪神梅田" dep_time:"18:29 "> >> puts ret[:type] => "直通特急"
名前付きマッチの後方参照はとても楽しい!!便利!!これで scanf みたいなレガシーとバイバイできそう
php でも動いた
<?php $str='直通特急 阪神梅田行 18:29 発 3番のりば'; $regex= "/(?<type>.+) (?<dest>.+)行 (?<dep_time>.+)発 /"; preg_match( $regex, $str , $matches ); var_dump($matches);
実行結果
takuya@orm$ php test.php array(7) { [0]=> string(39) "直通特急 阪神梅田行 18:29 発 " ["type"]=> string(12) "直通特急" [1]=> string(12) "直通特急" ["dest"]=> string(12) "阪神梅田" [2]=> string(12) "阪神梅田" ["dep_time"]=> string(6) "18:29 " [3]=> string(6) "18:29 " }
bash でも出来ないか?
できなかった。
takuya@orm$ regex='(?<name>.+)'; [[ "aaaaaaa aaaaaaaaaa" =~ $regex ]];echo "${BASH_REMATCH[0]}" takuya@orm$