• ベストアンサー
  • 困ってます

正規表現について教えてください。

正規表現について教えてください。 JavaScriptでプログラミングを行っています。 その中で文字列に対しゼロサプレスを行いたいと思い 調べた結果、正規表現を使用する以下のコードで 実現可能なことが分かりました。 val.replace(/^0+([0-9]+.*)/, "$1") コードを記述し実行すると確かに可能なのですが 正規表現を調べてみても何故これでゼロサプレスが可能なのか よく理解できませんでした。 申し訳ありませんが初心者でも理解できるように説明して頂けないでしょうか。 宜しくお願いします。

共感・応援の気持ちを伝えよう!

  • 回答数5
  • 閲覧数1535
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.2
  • luka3
  • ベストアンサー率77% (177/228)

正規表現のプロではないですが、自分なりに分解して説明してみます。 ^   …文字列の先頭から 0+   …「0に一致」と「直前の文字の1回以上に一致」、あわせて「1文字以上の'0'の連続」 (   …グループ化の始まり マッチした部分が$1に格納される [0-9]+ …「'0'から'9'に一致」と「直前の文字の1回以上に一致」、あわせて「1文字以上の'0'から'9'の連続」 .*   …「任意の一文字(\n以外)」と「直前の文字の0回以上に一致」、あわせて「任意の文字列」 )   …グループ化の終わり まとめると 文字列の先頭から1文字以上の'0'の連続があり、それ以降の'0'から'9'の連続と、残りの文字列が、$1に格納される と解釈できます。 そしてマッチした部分(今回の場合は文字列全体)が、$1に置き換えられます。 マッチしなかった場合(今回の場合1文字目が0じゃない場合)は、置換が実行されず元の文字列のままになります。

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • 正規表現についてお願いします。

    お世話になります。 javascriptの正規表現で仮に任意の桁数の文字列があり、その数桁目から数桁目の間のみを拾いたい場合にどのように記述すればよろしいでしょうか。 http://okwave.jp/qa/q6840301.html すいません。引用いたしました。 こちらの内容と同じことをJavaScriptで実現したいです。 よろしくおねがいします。

  • 正規表現について

    正規表現を使用して文字列の置換(ereg_replace)をしたいと思うのですが、 うまくいかず悩んでおります。。 以下の文字列があったとします。 【AAA】【BBB】【CCC】DDD 文字列の中から先頭から始まる【】でくくられたものだけ(【AAA】)だけ削除して、 結果を【BBB】【CCC】DDDとしたいのですが、正規表現でどのようにヒットさせればよいのか分りません。 ※【】の中にくる文字はAAAとは限りません。 お手数ですがご教授頂けますでしょうか。

    • ベストアンサー
    • PHP
  • 正規表現について

    /^R|ruby$/ 上記のような正規表現があったとします。 この正規表現の【|】の判断がわかりません。具体的には、/^ $/という記述から 対象の文字列の先頭がRかrのどちらかで以降がubyと続く文字列にマッチという 意味だと解釈しているのですが違うのでしょうか? 具体的にはRubyという文字列かrubyという文字列の二つのうちどちらかにしか マッチしないとおもっていたのですが、 rrubyという文字列やRrubyという文字列にもマッチします。そもそもこの場合のR|rの箇所ですが、これはRかrのどちらかが先頭にあり 二文字目からはubyという文字列がつづきますよ。という正規表現ではないのでしょうか? かなりこまっています。 識者のかたご教授ください。

その他の回答 (4)

  • 回答No.5
  • LOHA
  • ベストアンサー率52% (203/388)

#4です。 すみません、間違いがありました。 #3さんのおまけにありますが、 00などの時に、0を残さないといけないのですね・・・。失念していました。 なので、最後の2行は無視してください。

共感・感謝の気持ちを伝えよう!

  • 回答No.4
  • LOHA
  • ベストアンサー率52% (203/388)

まずお手元に適当な資料を用意。 http://www.tohoho-web.com/js/string.htm#replace http://www.tohoho-web.com/js/regexp.htm 順番に見てみると、 1. 「^0+」は「文字列先頭で1個以上の0とマッチ」 2. 「[0-9]+.*」は「1個以上の数値と以降の任意文字列」 と言えるかと思います。 Javascriptの場合、デフォルトで最大マッチなので、1の方で先頭から続く0を全てマッチさせることができます。 正規表現に含まれる括弧は、くくった順に$1, $2,...で参照できるようになります。 よってreplaceでは、第二引数で$1を指定することにより、正規表現全体にマッチした部分を、2の部分だけに置き換える、という処理が行われます。 なお、2に関しては、そんなに詳細に指定しなくても、別に「.*」でも良い気がします。 もっと言えば、replaceですので「val.replace(/^0+/, "")」のように、なくても良いと思います。

共感・感謝の気持ちを伝えよう!

  • 回答No.3
  • fujillin
  • ベストアンサー率61% (1594/2576)

正規表現は苦手なので詳しいわけではないのですが、つたない説明を… (だからって、他のものが得意ってわけでもないけど) まず、正規表現の概要やメタ文字の意味などについては、以下など参照してください。 (ぐぐれば解説はたくさん見つかると思います)  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

共感・感謝の気持ちを伝えよう!

  • 回答No.1
  • yyr446
  • ベストアンサー率65% (870/1330)

この正規表現の説明だけ聞いても、ふふーん となるだけで、 たいして知識にならないでしょう。参考サイトをいくつか挙げるので、 ちゃんと、自分で調べてみましょう! http://www.site-cooler.com/kwl/javascript/15.htm http://www.kt.rim.or.jp/~kbk/regex/regex.html http://www.komonet.ne.jp/~perl/chap7.htm http://www.mnet.ne.jp/~nakama/ とはいえ、お礼が欲しいから、つたない解説(うまく説明できてないかも... val.replace(/^0+([0-9]+.*)/, "$1") はvalの中で^0+([0-9]+.*)というパターンにマッチしたものを ([0-9]+.*)に置き換えます。 ※([0-9]+.*)が$1になります。 ^0+([0-9]+.*)は「行の先頭に0が1文字以上有り、続いて0から9の文字の どれかが1文字以上有り、続いて任意の文字が0文字以上ある」というパターン です。 ()内グループサブマッチのパターン [0-9]+.* の意味は、「0から9の文字の どれかが1文字以上有り、続いて任意の文字が0文字以上ある」というパターン です。 ※先の0は0+で取得されてるからこのグループには入らない

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • 正規表現にて質問があります。

    テスト勉強をやっていて過去問をみたら正規表現の部分だけわからずにいます (1)α=(0|10)*2(1|00|010)+ (2)α=(ab|c)*c(bc|a)+ (3)α=(1|22)*a(333|4444)* (1)正規表現αが表す文字列内、文字列長が1のものすべてを列挙せよ (2)正規表現αが表す文字列内、文字列長が2のものすべてを列挙せよ (3)正規表現αが表す文字列内、文字列長が3のものすべてを列挙せよ (4)正規表現αが表す文字列内、文字列長が4のものすべてを列挙せよ の答えを教えてもらえないでしょうか? もしよろしければどうやってとけばいいかのアドバイスもお願いします

  • 正規表現について

    変数の文字列を範囲指定して削除しようとしています。 正規表現を使って範囲指定したいのですが、うまくいきません。 <span class="shimei"> ~ </span> というのは正規表現でどのように書くのでしょうか? $name = mb_ereg_replace("<span class=\"shimei\">.*</span>","",$name); これはどこが間違っているのでしょうか?

    • ベストアンサー
    • PHP
  • |。ってなんですか? 正規表現

    正規表現の学習中です。読んでいる本の中に次の式がありました。  (?<=^|。)[^。]+。 日本語の文章の中から一文を抽出するための正規表現です。  。以外の文字がダーッと連なった後に。が来る文字列 とのことです。  [^。]は。以外の文字  +はそれが1個以上ある ですから  [^。]+ は  。以外の文字が1個以上ある という意味です。 その後に。が付きますから、  [^。]+。 だけで  。以外の文字がダーッと連なった後に。が来る文字列 ということになります。 では  (?<=^|。) の意味は何でしょう。  (?<=なんたら) は後方参照を意味しますから、 ^|。 のすぐ後に [^。]+ が続くと言いたいのでしょうか。 だとすると  ^|。 が問題です。  ^もしくは。 という意味なら、^は正規表現で記号として使われている文字ですから、  \^|。 と表現されそうなものです。 それに、。は文末でしか利用されない文字ですから、これに注目して検索を行うというのは理解できますが、^は日本語でなんら特徴を持つ文字ではありません。  ^もしくは。 という理解は間違いでしょう。 それでは^を記号として考えるとして、その前後を[]で囲んでいないから、この^は文字列の先頭を表すのでしょうか。そうすると件の正規表現は  先頭の|。のすぐ後から。以外の文字が連なった後に。が来る文字列 という意味になります。日本語の一文を抽出する正規表現という解説にかなり近づいてはいます。 しかし  |。 とは一体何? |はorを意味する記号ですが、  何とか or 。 という意味でしょうか。 でも「何とか」は「何とか」なりに何か文字表現がなされていても良さそうですし、それに  先頭の「何とか」または。のすぐ後から・・・ という解釈は意味不明。  |。 はどのように解釈すべきなのでしょうか。 お手数をお掛けします。

    • ベストアンサー
    • Perl
  • 正規表現について

    正規表現について LPIC黒本の問題で1つ困っています。 $ grep -E ^A[^A]A[^A] lpic.txt にマッチする文字列 答え AaAa となっていますが理解できません。 そもそも正規表現ってなんでしょうか? あまり難しいようなら飛ばしますが、 となたか教えてくれるお方おりましたらお願いいたします。

  • PHP 正規表現

    はじめまして^^ 現在、PHPでプログラムを作っています。 そして、文字列の置き換えをする機会があり、 正規表現をつかうことになりました!! 置き換えに使う関数は、mb_ereg_replaceです! ある条件にあった部分の文字列を置き換えしたいと思っています。 そして、いろいろとやっていきましたら、あるひとつの壁にぶつかりました。。 例えば、PHPでは、正規表現の部分を [^文字]とやると、『文』と『字』という文字列以外にマッチという意味になるらしいのですが、 『文字』という文字列以外にマッチ、というふうに、表現したい場合は、 どう表現すればよいのですか? [^(文字)]とか、その他いろいろ、 自分なりに、色々ためしたのですが、うんともすんともいいません、、 どなたか、わかる方教えて下さいm(_ _)m

    • ベストアンサー
    • PHP
  • PHPにおける正規表現について

    PHPにおける正規表現について ご教授ください。 いわゆる、対象の文字列が複数行にわたっていた場合のことです。 $data = <<< EOF ABCDE FGH EOF; $hoge = preg_match("/EF/" ,$data,$match); と上記のようなコードがあった場合 対象の文字列群から【EF】という文字列を検索したい場合、どのように記述したら 【E(間に改行)F】の文字列と一致させる事ができるでしょうか? 仮に正規表現の修飾子の【s】や【m】を用いても上記の例の場合 一致させることができないと思います。 やはり、対象の文字列群 $data の改行文字をいったん削除したものから検索 するのがベターでしょうか? 正規表現に造詣の深い方よろしくご教授ください。

    • ベストアンサー
    • PHP
  • 正規表現についての質問

    正規表現についての質問です。 どのようにすればいいのか分からずで困っております。 (1) ##画像ファイル:"test.jpg"## という文字列の場合は、test.jpgに置換 (2) ##画像ファイル:"test.jpg":"aiueo.jpg"## という文字列の場合は、 aiueo.jpg 上記を満たす、正規表現での記述方法をどなたかご教授頂けないでしょうか。

    • 締切済み
    • PHP
  • 正規表現について

    今lexのプログラムを書いているのですが、正規表現の部分でつまずいてしまいました。perlの正規表現なら分かるのですが、lexと少しかってが違い困っています。lexの正規表現でコメント(プログラム中で/**/で囲まれた部分)を読み飛ばす時には、どのような正規表現にしたら是非教えてください。なお/**/の中には文字列*/は出てこないと過程していいとのことでした。 解答お願い致します。

  • 正規表現で一発置き換え

     次のような条件の正規表現を模索中です。 ・対象はHTML文書 ・タグの外側のみ置き換える ・特定タグで囲まれた範囲は置き換え対象外とする  たとえば、   ABCDEF<B>GABC</B>KLM<STARTCOMMENT>ABCDE</ENDCOMMENT>OPQABCDE  という文字列があるとき、replace(/(A|B|C)/, "*") を実行するとします。  すると、   ***DEF<*>G***</*>KLM<ST*RT*OMMENT>***DE</END*OMMENT>OPQ***DE  普通ならこうなってしまいますね。  これを、   ***DEF<B>G***</B>KLM<STARTCOMMENT>ABCDE<ENDCOMMENT>OPQ***DE  こうなるようにしたいのです。  タグは置き換え対象としないという正規表現は実現できたのですが、特定タグで囲まれた範囲を対象外とする記述が思い浮かびません。  なぜなら、「<ENDCOMMENT>のない<STARTCOMMENT>があれば、それ以降を全て置き換え対象外とする」という仕様にしてしまったためです。  なんとか一文でバチッと置き換えるようなものがあれば、ヒントだけでも結構ですのでお教えください。

  • Linuxで、正規表現を使って、アクセスログから

    Linuxで、正規表現を使って、アクセスログから a_id=12345 という文字列を含む行を抜き出し、別ファイルへ保存したいのですが、 どのようにコマンドを実行すれば、実現できるでしょうか?