1 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 00:36:04 ] 正規表現(Regular Expression)スレです。 質問する場合は実装言語や処理系ソフトウェア名を示しておくと話が早いです。 【 前スレ 】 正規表現 Part5 pc12.2ch.net/test/read.cgi/tech/1212498448/
683 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 20:29:25 ] [^0-9A-Zアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン゛°\\,\.「」\(\)\-\/] を に置換 あってるかどうかは試してないけどこういうこと?
684 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 22:49:43 ] >>683 レスどうもです。そのとおりです。 >>682 の条件を変数$regExpに代入し、 $result = 'パ-カ-ヲ買ツタ01234567'; $result =~ s/$regExp/ /g; とすると、漢字だった部分が文字化けし、「パ-カ-ヲ ・糟・1234567」となってしまいます。 結果は「パ-カ-ヲ ツタ1234567」にしたいのです。
685 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 00:05:51 ] 未定義領域含んでるんじゃね? 文字の正規表現 www.din.or.jp/~ohzaki/perl.htm#Character
686 名前:デフォルトの名無しさん [2009/12/26(土) 00:26:46 ] 質問があります。 <div id=・・・>←1 <div id=・・・> </div>←2 <div id=・・・> </div>←3 </div>←4 抜き出したいのは1から4全体なんですけど "<div id=・・・(.+?)</div> で非欲張り系で抜き出すと1から2までヒットします。 1から4全体を抜き出す方法ていうのはないのでしょうか? XML形式ならいけるぽいのですが・・・ 無理なのでしょうか?
687 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 01:52:00 ] 対応するタグという意味なら田中スペシャルが使えればできる。
688 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 08:16:39 ] ていうか素直にXMLパーサ使え
689 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 12:19:49 ] HTMLの処理には正規表現ではなくHTMLパーザを、XMLの処理にはXMLパーザを。 テンプレに入れてもいいレベルのFAQ。
690 名前:デフォルトの名無しさん [2009/12/27(日) 02:55:21 ] わかりました。パーサを調べてみます
691 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 18:29:47 ] 文字列を分割するとき、特定の文字で囲われているものは除外するっていう方法ありますか? phpなんですけど preg_splitで例えば A,B,C,'D,E',F を [0]=A [1]=B [2]=C [3]=D,E [4]=F 上記のように分割できますか?
692 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 18:34:35 ] 普通にCSVのモジュール使えばいいのでは
693 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 19:36:26 ] >>691 詳説 正規表現 にCSV処理のサンプルあるよ。オヌヌメ
694 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 15:29:52 ] ●正規表現の使用環境 Java1.5(Firefox 3.0.16) ●検索か置換か? 検索 ●説明 \.nas(3|5)\d+\.[a-z\-]+\.nttpc.ne.jpという文字列を検索したいです。 ※検索対象の文字列自体が正規表現のようになっています。 ●対象データ \.nas(3|5)\d+\.[a-z\-]+\.nttpc.ne.jp ●希望する結果 \.nas(3|5)\d+\.[a-z\-]+\.nttpc.ne.jp ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ※完全一致 自分なりに\を付けたりして試してみたのですが出来ませんでした。 以上、どうかよろしくお願いします。
695 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 17:02:17 ] 文字列定数内の \ 自体を \\ とするエスケープまで含めて "\\\\\\.nas\\(3\\|5\\)\\\\d\\+\\\\\\.\\[a\\-z\\\\\\-\\]\\+\\\\\\.nttpc\\.ne\\.jp" となる
696 名前:デフォルトの名無しさん mailto:sage [2009/12/31(木) 10:01:19 ] >>695 694です。 どうもありがとうございました。 すごく長い表現になっちゃうんですね。(汗
697 名前:デフォルトの名無しさん mailto:sage [2009/12/31(木) 15:49:42 ] こんにちは。 度々すみませんが、よろしくお願いします。 ●正規表現の使用環境 Java1.5(Firefox 3.0.16) ●検索か置換か? 検索 ●説明 #ipbf\d+souka.saitama.ocn.ne.jp という文字列を検索したいです。 //マッチする var body = document.body.innerHTML; var temp1; temp1 = new RegExp(/#ipbf\\d\+souka.saitama.ocn.ne.jp/); alert(temp1.test(body)); //マッチしない var body = document.body.innerHTML; var word = new Array(); var temp2; word.push('#ipbf\\d\+souka.saitama.ocn.ne.jp'); for (var i = 0; i < (word.length); i++) { temp2 = new RegExp(word[i]); alert(temp2.test(body)); } ●対象データ #ipbf\d+souka.saitama.ocn.ne.jp ●希望する結果(※完全一致) #ipbf\d+souka.saitama.ocn.ne.jp ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 「//マッチしない」方の配列内容を変えずに(\を追加せずに)一致させたいです。 以上どうか、よろしくお願いします。
698 名前:デフォルトの名無しさん mailto:sage [2009/12/31(木) 16:25:29 ] Pattern.quote 使えばできるんでない?
699 名前:デフォルトの名無しさん mailto:sage [2009/12/31(木) 22:01:43 ] >>697 word.push(/#ipbf\\d\+souka.saitama.ocn.ne.jp/);
700 名前:デフォルトの名無しさん mailto:sage [2009/12/31(木) 22:38:39 ] >Java1.5(Firefox 3.0.16) JavaじゃなくてJavaScriptでしょ?それなら>>695 は正規表現リテラルでこう書ける /\\\.nas\(3\|5\)\\d\+\\\.\[a\-z\\\-\]\+\\\.nttpc\.ne\.jp/
701 名前:デフォルトの名無しさん mailto:sage [2010/01/02(土) 16:48:00 ] >>698 >>699 >>700 返事が遅くなりすみません。 レスありがとうございます。 体調が悪くまだよく試していないのですが、まずはお礼だけで失礼します。
702 名前:デフォルトの名無しさん mailto:sage [2010/01/03(日) 22:07:34 ] JavaとJavaScriptが区別できない人っていまだにいるのか…
703 名前:デフォルトの名無しさん mailto:sage [2010/01/03(日) 23:16:48 ] VBとVBAの違いもな。 説明するの大変なんだよな・・・。
704 名前:デフォルトの名無しさん mailto:sage [2010/01/03(日) 23:32:15 ] VBとVBAの違いなんて知らない奴たくさんいるだろ VB触ってるのは底辺だけなんだから
705 名前:デフォルトの名無しさん mailto:sage [2010/01/03(日) 23:55:38 ] ゲーム機は全て「ファミコン」だ。
706 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 01:36:20 ] ファミコンって何だ? ピコピコのことか?
707 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 13:05:34 ] ピコピコはゲームウォッチ系じゃねーの? 知人が20万円ほど出してPC-98を買ったら 姉に「たっかいファミコンやなぁ」と言われたらしい。
708 名前:デフォルトの名無しさん [2010/01/05(火) 12:45:41 ] ●正規表現の使用環境 Java1.5 ●検索か置換か? 検索 ●説明 123456700 とか12345678-00など 7桁から10桁の数字にあと2桁の数字がハイフンもしくは連続して付属する数列の検索。 数列の直前にCodeまたはInvoiceがついてたら除外する。 Invoice 12345678-00 はマッチしないけどaccess# 12345678-00 はマッチする。 "On Invoice 123446789, your order was placed. However, please be sure to note that your account number 789456123 is suspended until further notice." 最初の番号Invoice 123446789は無視するけどaccount number 789456123はマッチするようにしたい。 ●対象データ Invoice 123446789 word 454545454 454545454545 Code: 4085432259 passcode 6789012 06 number 8901234 08 word 454545454 word ●希望する結果 マッチしない Invoice 123446789 Code: 4085432259 passcode 6789012 06 Code 7890123-07 ^(?!(Code|Invoice).)([^=\/%(.]\b\d{7,10}((\d?\d?)|(-\d\d))?\b) 自分でここまでやったけどうまく動かないです。 よろしくお願いいたします。
709 名前:デフォルトの名無しさん mailto:sage [2010/01/05(火) 13:09:16 ] javaならプログラム書けるんだからInvoice,Codeのことはとりあえず 忘れてマッチさせて、そのあとでマッチ位置からさかのぼってCode, Invoiceがないことを確認する方がたぶん楽だと思うよ。
710 名前:デフォルトの名無しさん mailto:sage [2010/01/05(火) 13:09:29 ] javaならプログラム書けるんだからInvoice,Codeのことはとりあえず 忘れてマッチさせて、そのあとでマッチ位置からさかのぼってCode, Invoiceがないことを確認する方がたぶん楽だと思うよ。
711 名前:デフォルトの名無しさん mailto:sage [2010/01/05(火) 13:10:13 ] すまん2つ出た
712 名前:デフォルトの名無しさん [2010/01/05(火) 14:16:10 ] ありがとうございます。実際にはJAVAで作成しているわけではなく、アプリケーションがJAVAとおなじ正規表現を使用している環境なので、プログラムを書くことはできないんです。それでここでアドバイスがいただければと思いまして、
713 名前:デフォルトの名無しさん mailto:sage [2010/01/05(火) 14:30:07 ] look-ahead(?!...)じゃなくてlook-behind(?<!...)を使うとこだね。 そしてlook-behindはたいていある決まった長さのの文字列に マッチするパターンがしか使えないので、 (?<!Invoice: )(?<!Invoice )(?<!Code: )(?<!Code ) のように並べて使うことになるだろう。 必要な仕様がきちんと書かれてないのでこれだというのは 示せないけどがんばれ。
714 名前:デフォルトの名無しさん mailto:sage [2010/01/05(火) 14:51:49 ] ●正規表現の使用環境 VB.NET ●検索か置換か? 検索 ●説明 タブを含む何かの文字列の複数行を表す方法を教えて ●対象データ AAAA TAB TAB hogehoge改行 あああああ TABT ABT AB hogehoge改行 TAB TAB hogehoge改行 ZZZZ ●希望する結果 あああああ Regex("AAAA\n([\t.]+?\n)+(?<1>.+?\n)([\t.]+?\n)+ZZZZ",MultiLine) 上のように書いてみましたがだめでした。 AAAA改行とZZZZの間の文字列をターゲットにしつつ その中にタブか何かの文字の組み合わせの文字列が1つ以上あって、行末に改行がある という行がいくつかある。 ということを書いたつもりなのですが間違っているところを教えて頂きたいです。
715 名前:デフォルトの名無しさん mailto:sage [2010/01/05(火) 15:06:04 ] [\t.]だとタブまたは任意の文字なので結局[\t.]+?は.+?と書いたのと同じ。 また、〜+?とは普通書かないね。〜*と同じなので。 \tが少なくとも一つ含まれた行にマッチさせたいなら、 .*\t.*\n
716 名前:デフォルトの名無しさん mailto:sage [2010/01/05(火) 15:09:31 ] いや+?は最短マッチだろ。
717 名前:デフォルトの名無しさん mailto:sage [2010/01/05(火) 15:12:27 ] Multilineなら\nは.に含まれないので、.+?\nと書いても結局.*\nと 同じになるっていいたいんじゃねーの?
718 名前:デフォルトの名無しさん mailto:sage [2010/01/05(火) 15:48:20 ] それをいうなら.+じゃないか
719 名前:デフォルトの名無しさん mailto:sage [2010/01/05(火) 16:31:59 ] 前にも .+? と .* が等価だと思ってる人がいたような。 \d? とかの ? と同じものに見えてるのかな。
720 名前:デフォルトの名無しさん mailto:sage [2010/01/05(火) 22:00:58 ] >>715 [\t.] ってブラケットの中にはいってんのなら'.'は単なるピリオドでしょ。
721 名前:デフォルトの名無しさん mailto:sage [2010/01/10(日) 22:09:28 ] Javascriptを勉強中です。といっても、ブックマークレット程度しかやってませんが。 正規表現を練っていたときに、もうかなり以前のブラウザから最短一致(ものぐさ/non-greedy/非貪欲)が 使えるようになっていたことを知り、いま必要というわけではないのですが、詳しく調べてました。 {n,m}? {n,}? *? +? ?? ←これらについては自習して使い方を理解したのですが、{n}? が解りません。 どう考えても {n} と {n}? は同じ結果になるように思えるのです。 正規表現のリファレンスや正規表現を解説しているサイトは数多く見ましたが、量指定子の直後に?を付けた {n}? を紹介はしていても、その使い方を例示したものを見つけることが出来ませんでした。 どなたか解説していただければ幸いです。よろしくお願いします。 記号関係はGoogleでも検索しづらいので、なかなか見つかりません。Googleの弱点ですね。
722 名前:デフォルトの名無しさん mailto:sage [2010/01/10(日) 22:36:48 ] googleに頼り切ってるヤツの弱点に見えるけどなぁ ttp://www.kt.rim.or.jp/~kbk/perl-5.8/perlretut.html >a{n}? = ちょうどn回の繰り返しにマッチします。ちょうどn回なので、a{n}と等価であり、一貫性のためだけに存在します。 要するに/x{1}/の意味を問うているようなもん
723 名前:デフォルトの名無しさん mailto:sage [2010/01/11(月) 12:53:43 ] >>722 的確な回答ありがとうございます。 >googleに頼り切ってるヤツの弱点に見えるけどなぁ 検索ばかりしてるんじゃなく良書を得てそれで勉強せよ、またはGoogleに頼り切ってると 目が節穴になるぞ、というお叱りと理解いたしました。 ☆perlretut - Perl の正規表現のチュートリアル ttp://www.kt.rim.or.jp/~kbk/perl-5.8/perlretut.html これは>>2 の一番最初、「正規表現メモ」のページにある一番最初のリンクですね。 答えへの近道はGoogleでなく、このスレにあったようで…目が節穴でした。 このチュートリアルはとても解説が丁寧で、まさしく良書だと思います。これで勉強します。 結論としては /x{n}/ と /x{n}?/ は同じ結果なので、通常 {n}? は使用されない、ですね。 やはりPerlだと細かい情報もしっかりあってスゴイです。 これからは正規表現で悩んだらこのスレとPerlの周辺を当たってみようと思います。
724 名前:デフォルトの名無しさん mailto:sage [2010/01/11(月) 15:57:50 ] >>723 それ、Perlのマニュアルなんだよ。UNIX系のシステムだったら man perlretut を実行すると表示されるよ。 ウェブを見るより先にマニュアルを読めってことで。
725 名前:デフォルトの名無しさん mailto:sage [2010/01/11(月) 16:31:29 ] .NET のマニュアルにも {n}? は {n} と等価って書いてあるな。 なんか訳が微妙におかしいけど。 msdn.microsoft.com/ja-jp/library/3206d374 (VS.80).aspx
726 名前:723 mailto:sage [2010/01/12(火) 22:05:22 ] >>724 UNIX系とは縁がありませんが、perlre/perlretutはWeb上にあるので、それをmanの代わりにします。 Javascriptで使える表現かどうかは、以下を見てチェック。 ☆RegExp - Core JavaScript 1.5 Reference - Mozilla Developer Center ttps://developer.mozilla.org/ja/Core_JavaScript_1.5_Reference/Global_Objects/RegExp 出来るだけ大本の公式情報を参照すべし、ですね。 >>725 情報ありがとうございます。間違ってはいませんが、確かに変ですねぇ。 perlretut、面白いですね−。塩基配列のストップコドンのとことか。 自習してみて、チュートリアルと同じ結果になるのを確認したのはいいのですが… Javascript:var R=/(\w\w\w)*?TGA/g, S='ATCGTTGAATGCAAATGACATGAC', A = [], I = 0; while(R.test(S)) {A[I] = RegExp.lastMatch + ' (' + RegExp.lastParen + ') Pos=' + R.lastIndex; ++I;} alert(A.join('\n\n')); なぜずれるのか、理解できず…。その後バックトラックの動作を知り、単に「必ず3文字ずつ進む」と 思い込んでただけだと気付きました。。。マッチにトライして失敗したらそこで終わりではなく、 開始位置を1文字進めるんですね。筆者が仕掛けた罠に見事にハマりました。。。 というか、こういう処理は素直に3文字ずつ取り出して判定すべきですよね。 なお、Javascriptには\Gなんてありませんでした。残念!
727 名前:デフォルトの名無しさん mailto:sage [2010/01/13(水) 21:03:05 ] >726 man じゃなくても perldoc perlretut でいけるよ。
728 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 16:56:04 ] >>725 MSDNライブラリは機械翻訳だからしかたないべ