雑記

2000|01|
2003|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|
2007|01|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|09|11|
2009|02|03|05|06|07|08|10|11|12|
2010|01|03|04|05|06|07|08|09|10|
2011|05|06|09|10|
2012|03|07|09|12|
2013|01|02|04|05|07|08|10|11|
2014|04|05|08|10|12|
2015|01|05|
2016|09|

2007-08-01

[Ruby] カッコとプラス

いきなり問題です。以下の式のを評価したとき、$1には何が入るでしょう?

"12345abc" =~ /^(\d)+/

"12345"だと思った人。それは私が元々書きたかったプログラムの結果です。

"1"だと思った人。私もこれに気づいたときにはそうなるんじゃないの?と思いました。さらに$2 = "2", $3 = "3", ...とか。

というわけで、答えは上のいずれでもなく、"5"でした。

憶測ですが、括弧のカウンタがあって、上記の例では$1に「\d」にマッチする結果を代入する、という評価が直後の「+」によって繰り返されるが、括弧のカウンタはインクリメントされない。とかいう実装なんでしょうか。そう考えると実装としては素直か(えらそう)。

ではこれを踏まえて次の問題。以下の式のを評価したとき、$1には何が入るでしょう?

"12345abc" =~ /^(\d{2})+/

答えは"34"。2個ペアの数字を先頭から順に評価するので、"34"の後ろの"5a"はマッチしないと。

で、素朴な疑問として、こういう仕様で何かうれしい場面ってあるんでしょうか?なんかありそうな気がするんですがそれに思い至らない自分が悔しくて。

最後に問題。"12345abc"から"45"を取り出す正規表現は?