Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

正規表現で「*(0個以上)」や「?(0または1個)」を使うときに気をつける事

正規表現で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

"?"の説明を「0または1個以上」と説明されていますが、「0または1個」が正しいのではないでしょうか?

とのご指摘を頂き、修正しました。
すみません普段あまり「?」使ってないので素で忘れていました(白目