質問: 正規表現について教えてください。 正規表現について教えてください。 javascriptでプログラミングを行っています。 その中で文字列に対しゼロサプレスを行いたいと思い 調べた結果、正規表現を使用する以下のコードで 実現可能なことが分かりました。 val.replace(/^0+([0-9]+.*)/, "$1") コードを記述し実行すると確かに可能なのですが 正規表現を調べてみても何故これでゼロサプレスが可能なのか よく理解できませんでした。 申し訳ありませんが初心者でも理解できるように説明して頂けないでしょうか。 宜しくお願いします。
回答: 正規表現は苦手なので詳しいわけではないのですが、つたない説明を... (だからって、他のものが得意ってわけでもないけど) まず、正規表現の概要やメタ文字の意味などについては、以下など参照してください。 (ぐぐれば解説はたくさん見つかると思います) http://www.site-cooler.com/kwl/javascript/15.htm http://www.albert2005.co.jp/study/javascript/regexp.html > /^0+([0-9]+.*)/ を分解して大雑把に説明すると ^0+ = 行頭が0で始まる一文字以上の連続する0 [0-9]+ = 一文字以上の連続する数字(=0~9まで) .* = 0個(=なし)以上の文字列 () = グループを指定 (この部分が$1として参照される) という意味になります。 要は{ 「前ゼロ部分」(「連続する数字」+「文字列」) }という部分が見つかったら、()内(=$1)に置き換える(=reolace)ということになります。(「文字列」はなくてもよい) 例として"0000123"を考えた場合、マッチすることはわかると思いますが、0 と 000123 などのように分割されてもよさそうに思えます。 しかし、正規表現の場合、+や*の指定では、なるべく長い文字列をヒットさせるというルールになっているようで、この場合先にある「^0+」に対してできるだけ長くとると「0000」が該当するように解釈されて、0000 と 123 という分割になり、"0000123"→"123"という置き換え結果になります。 "0000123.456"や"0000123e45"のような場合は、数字の後ろに小数点やeが出てきたら、最後の.*に該当しますが、この部分は「数字以外の文字が出た後の文字全部」と言い換えることができますので、結局()ブロックには前ゼロ部分以外の残り全部がマッチすることになります。 (このルールを変える表現として +? や *? などがありますが、調べてみてください) ^0+となっているので、"$0000123"みたいに先頭に記号があったり、" 0000123"のように空白があるだけでもマッチしなくなります。 おまけ "00"の場合は、[0-9]+に対して1個以上の0がマッチの条件となるので0 と 0に分けられて、結果、0に置き換えられることになります。 "0"の場合には、^0+と[0-9]+でそれぞれ1個以上の0(または数字)がなければならないので、マッチしないことになり置き換えはおきません。(結果は"0"のまま) 多分、事前に数値であることのチェックを別途行っていると思いますが、文字列の"id007"や"007:id"を対象に考えてみるとそれぞれ "id007" → id007 (マッチしない) "007:id" → 7:id (マッチして置き換わる) のようになります。 などと調べていたら、↓にちょっと面白い記事がありましたので、ご参考まで。 http://d.hatena.ne.jp/koseki2/20090530/jsidiom