• ベストアンサー

javascriptの正規表現で重複して検索

javascriptの検索において、検索パターンを正規表現で指定し、gオプションで全検索とした場合です。 1度目にマッチした文字列のうち一部が、後に続く別の文字列と組み合わさると、新たに検索パターンとマッチする場合、これについてもマッチさせる方法はないでしょうか。 var x = 'ペンギン3年4月5日'.match(/\D\d[年月日]/g); document.write( x ); これを実行すると、 「ン3年」 しか表示されませんが、 「ン3年」「年4月」「月5日」 の3つとも表示させるようにしたいのです。

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

  • ベストアンサー
  • pringlez
  • ベストアンサー率36% (598/1630)
回答No.3

そのような処理ではmatchは不向きですね…。 execなら(イレギュラーな使い方をすることで)何とか対応できます。 var str = "ペンギン3年4月5日"; var reg = /\D\d[年月日]/g; var x; while(x = reg.exec(str)) { document.write(x); reg.lastIndex--; }

biwa_nya-su
質問者

お礼

不勉強でexecをよく知らなかったのですが、これで行けそうです。 execのリファレンスを今読んでいます。 ありがとうございました。

その他の回答 (2)

  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.2

あまり深く考えていないのですが、年月日をそれぞれ2個に置き換えてから検索してはどうでしょうか。 var x = 'ペンギン3年4月5日'.replace(/([年月日])/g, '$1$1').match(/\D\d[年月日]/g); document.write( x );

biwa_nya-su
質問者

お礼

これは考えつきませんでした。 今回の実際のコードは、このあともう少し複雑な置換を何度か行うため、これではさらに手順が増えることになりやや適さない方法でしたが、今後何かで使わせていただくと思います。 ありがとうございます。

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.1

そのコードを私の環境で実行すると 「ン3年」 ではなく 「ン3年,月5日」 となるわ。 それはさておき、「年4月」も取得したいとなると 複雑なコードを書くしかないわ 普通にマッチングを行うと ペンギン3年4月5日 最初は「ペ」から開始して 「ン3年」を検索し終わると その次の開始地点は「4」からになっちゃう なので、開始地点を変えて再度マッチングするように 作らないといけないわ substringやRegExp.indexを使ってやるしかないわね めんどくさいけど

biwa_nya-su
質問者

お礼

例に挙げたコードの実行結果は、確かに 「ン3年,月5日」 でした。すみません。 やはり一筋縄ではいかないのですね。 substringやRegExp.indexで2文字目から再検索という方法、ありがとうございます。

関連するQ&A

  • JavaScriptの正規表現/?<.+?>/について

    strからHTMLのタグを取り除いた文字列をxにしまうため var x=str.replace(/<.+?>/g,""); を使うそうですが /<.+?>/g をなぜ使うのかが分かりません /<.+>/g がまずいのは分かりますが・・・・ 教えていただければ幸いです

  • 正規表現のコーディングについてお願いします。

    こんにちは、よろしくお願いいたします。 正規表現パターンを書く場合に皆さんがどのようにされているか教えてください。 例えば(ちょっとムリヤリ感が強いですが)、'Price \5800-' という文字列の \5800 の部分に preg_match でマッチさせたいとします。 単純に考えると、 /\\\d+/ のようなパターンが思いつくのですが、それを文字列として preg_match に渡す際に、コードはどのように書かれますか? <?php   $str = 'Price \5800-';   //とりあえず、'/\\\d+/' と書き、'/\\\\\\d+/' と、\ をそれぞれの \ に書き足す   if ( preg_match('/\\\\\\d+/', $str, $match) ) {     print_r($match);   } ?> 「まず、パターンを書き、全ての \ の前に \ を書き足す。」というのが無難なのかな?と思い、そうしていますが、 そういった考え方で間違っていないでしょうか? どうぞよろしくお願いいたします。

    • 締切済み
    • PHP
  • 正規表現 たのしいRuby

    たのしいRubyを買ってきて勉強しているのですが、 分からなくて躓いてきて、だんだん楽しくなくなってきたので 誰か教えてください。 ■1.P268 □パターン / ^(ABC)?$ / □文字列 "" □マッチする部分 "→←" となっているのですが、ABCが繰り返されてもいないのにマッチしている理由が分かりません。 ■2.P268 □パターン / ^(ABC)?$ / □文字列 "ABCABC" □マッチする部分 "マッチしない" となっているのですが、ABCが繰り返されてもいるのにマッチしない理由が分かりません。 ■3.P272 □パターン / (ドット)(/d/d)+(ドット) /=~ "123456" p $1 # => "1" p $2 # => "45" p $3 # => "6" となっているのですが、p $2 # => "45"と書かれている理由が分かりません。(p $2 #= > "23"だと思うのですが…) ■4.P272 □パターン /(ドット)(?:/d/d)+(ドット)/ =~ "123456" p $1 # => "1" p $2 # => "6" となっています。しかし、p $2 は、(ドット)(?:/d/d)+(ドット)/ の部分を指すのだと思っているのですが、何がどうなっているのかさっぱり分かりません。

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

    お世話になります。 ●●● ●●● という文字列かどうか判断する正規表現を作成したいです。 条件としては、 ・「文字1 (←全角スペース)文字2」という感じで、文字1と文字2に全角スペースが挟まれている感じで、文字列の先頭にも末尾にも空白文字は入ってはいけない(真ん中に1つのみ) ・文字1と文字2には、数字・空白以外の文字が入る(主に感じ・ひらがな・カタカナが入る)(文字数は一文字以上) といったところです。 自分で作成した正規表現は、 $pattern = '/^([\d\S])+ ([\d\S])+$/'; if( !preg_match($pattern,$chkStr) ) print "マッチしていない"; } なんですが、どうもマッチしてほしい文字にマッチしていないようなのです。 お手数ですがご教授ください。

    • ベストアンサー
    • PHP
  • javascriptの配列の検索について

    テキストエリアに入力された文章を、改行ごとで配列に格納 その後、特定の文字を検索し、特定の文字がある配列を見つけて 見つかったものに処理をかけたいです 現在、配列に格納するところまでできているのですが、その後の文字を検索するところで躓いてます。 配列をmatchで検索すると一番最初の配列にのみ処理をかけてしまっているのが現状です。 どなたかお知恵を貸していただけないでしょうか よろしくお願いします。 例 入力された文字列:                明日の時刻のお知らせ                開始時間:10時30分                受付開始は10時00分からとなっております。                遅れないようにお願いいたします。 検索する文字:  時間     ↓ 検索ワードを含む配列:開始時間:10:30     ↓これに処理かけて 出力:10:30 検索ワードが見つからない場合 出力:10:00 10:30 という形にしたいです。 プログラムは下記のように組みました。 //////////////////////////// <html> <head> <script language="JavaScript"> function tester(){ var str= document.getElementById('input_text').value; var time; var alltime; abc = str.split(/\r\n|\r|\n/); var g = ["開始時間"]; for (var i=0;i<abc.length;i++){ if(abc[i].match(g)){ time = abc[i].match(/\d{1,2}:\d{1,2}/g); if(time2 !=null){ alert(time); document.write(time); break; } }else{ alltime = str.match(/\d{1,2}:\d{1,2}/g); if(alltime !=null){ document.write(alltime); } }break; } } </script> </head> <body> <textarea id=input_text rows="10" cols="45"> </textarea><br> <input type=button onclick="tester()" value="start"> </body> </html>

  • 正規表現について

    VB6ですが・・・ '次のようなコードがあって <!-- と --> に囲まれる文字列を抜き出したのですが 'どのようなパターンマッチを書けばいいのでしょうか? 'HTMLのコメントのみを抜き出したいと思っています。 Const s = "<!--今日-->" _ & "<!--僕は--><!--正規表現を--><!--勉強します-->" Dim x As RegExp Dim v As match Set x = New RegExp x.Pattern = "パターン" x.Global = True For Each v In x.Execute(s) Debug.Print v.Value Next

  • メルアドをチェックする正規表現?

    こんにちは,よろしくお願いします。JavaScriptでメルアドをチェックしようと次のような文字列を,patternという変数に代入して, var pattern = "^[a-z0-9\-_.]+@[a-z\-]+(\.[a-z\-]+)*com|net|org|edu|gov|mil|int|info|biz|name|pro|museum|aero|coop|[a-z][a-z]$"; 次のようにチェックしたのですが, if(mail.match(pattern)){・・・ "aa"など,2つ以上の小文字のアルファベット文字列にマッチしてしまいます。つまり,@が入っていなくてもマッチしてしまいます。実は,正規表現の解説書を見てこのような文字列としたのですが,JavaScriptでは不都合な点があるのでしょうか?ご存知の方がいらっしゃいましたら,ご教授ください。よろしくお願いします。

  • 正規表現について

    PHP5.2.4を使用しています。 任意の数の引数がある文字列をpreg_matchを使ってマッチさせたいのですが、 例えば"ENUM(ab,cd)"は ab と cd の2つの引数があるとします。 次のようなパターン文字列まではアイデアとして浮かんだのですが、 引数の最後は , がないので当然ですがマッチしません・・・ どのようにパターン文字列を記述すれば良いのでしょうか? $str = "ENUM(ab,cd)"; if (preg_match("/ENUM\(([^\,]+\,)+\)/", $str, $match)) { print "{$match[0]}<br>\n"; }

    • 締切済み
    • PHP
  • 正規表現での検索がうまくいきません…

    質問させて下さい。 WindowsにてAtivePerlの5.8.6.811を使っています。 サーバはAnHttpdです。 htmlの文章ファイルを読み込んで、空白行で区切ってリストに読み込み、そのリストを配列ごとに正規表現で検索して、マッチしたものだけをhtmlで表示しようとしています。 ところが、検索結果にどうにも変な時があります。 少し試したところ、「ゲーム」「ラッキー」などの「ー」が入る文字を検索しようとすると、全く処理をしてくれないのです。 その上、そのパターンマッチ検索のスクリプトより下に書いた行が全て実行されなくなってしまいます。 Shift-JISで書いているので、ダメ文字の類なのかとも思い、シングルクォートで囲ったり、「ー」の後に\をいれてみたりもしましたが、変化ありません(十や表はこれでうまくいきました…)。 また、それ以外にも、「スイス」などという、絶対に書かれていない単語で検索しても、検索されてしまう配列があったりします。 これに至っては完全に謎です…。 分かる方がいらしたら、どうかよろしくお願いします。

    • ベストアンサー
    • CGI
  • 正規表現を教えてください。

    正規表現を教えてください。 C#で正規表現を用いた文字列検索を勉強中なのですが、うまくマッチさせることができません。教えていただけないでしょうか。 検索対象の文字列は下のようになります。 キーワード;値; 文字列中に該当するキーワードが存在する場合に、その値を取得するプログラムを考えています。しかし、私の正規表現では2つ目の「;」を検出してしまい、キーワードのみを取得することが出来ずに困っています。 見当違いの表記をしているとは思うのですがどなたかお助けください。 match = Regex.Match(line, "^(.*);"); C#初心者なものです。

専門家に質問してみよう