久しぶりに、正規表現をがんばって書いた。

普段は、せいぜい数十文字で事足りる正規表現だけど、
今回は、リテラルが多いせいもあって、100文字超の正規表現。

まぁ、その話はソート、
そういえば、正規表現で、$という記号は、行末を表している。

なので、英数字が入力されているかのチェックをうっかり
^[a-zA-Z0-9]*$
ってやると痛い目を見ることがある。(正規表現のオプションによって話が変ってくる。)

というのも、”foo\nあああ”みたいに、改行文字を含んでいると、
そこが行末になるから、正規表現がマッチしてしまう。

確実な方法としては、文末を表す記号(Javaだと、\Zとか\z)を使うとか、
オプションで改行文字を通常文字とみなすとか、色々あるけど、自分は
[^a-zA-Z0-9]
がマッチしたらNGという方法を使っている。

つまり、英数字以外の文字が1文字でもあればマッチするという、
パターンをつかって、マッチしたらNGというチェックをする。

知っている人ならば、割と当たり前の話かも知れないけど、
正規表現になれ始めた頃に開く落とし穴なんだよね。