正規表現で0個以上系の量指定を使うときにはちょいと注意が必要です。
基本、*はゼロ個以上
""io899hoge".match /(\d*)hoge/ #=> #<MatchData "899hoge" 1:"899">
?は0または1個のマッチに対応します。
"io899hoge".match /(\d?)hoge/ #=> #<MatchData "9hoge" 1:"9">
ところが・・・
例えば「iohoge」という文字列から、hogeの前にある数値を抽出したい・・・と正規表現を描くと
"iohoge".match /(\d?)hoge/ #=> #<MatchData "hoge" 1:"">
と、ヌルではなく空文字が入ってきます。
空文字はfalseでもヌルでもないので、条件判定の時に意図しない挙動をする恐れがあります。
この辺りは、Active_supportのメソッドのblank?メソッドを使うと綺麗にできたりはしますが…gemを読み出すまでもない小スクリプトを描いたりする時は注意が必要です。
参考もと
更新履歴
11/26
@shuzo_kino RubyのTipsいつも興味深く拝見しています。先日の正規表現のエントリですが、"?"の説明を「0または1個以上」と説明されていますが、「0または1個」が正しいのではないでしょうか?
— ちーぴん (@chieping) 2014, 11月 26
"?"の説明を「0または1個以上」と説明されていますが、「0または1個」が正しいのではないでしょうか?
とのご指摘を頂き、修正しました。
すみません普段あまり「?」使ってないので素で忘れていました(白目