1 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 22:07:28 ] 正規表現(Regular Expression)スレです。 質問する場合は実装言語や処理系ソフトウェア名を示しておくと話が早いです。 前スレ 正規表現 Part4 pc11.2ch.net/test/read.cgi/tech/1186030400/
449 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 00:40:18 ] とりあえず 置換前:^(.*\\)(.*?)$ 置換後:D=\1\r\nF=\2
450 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 01:03:03 ] >>449 ありがとうございました
451 名前:デフォルトの名無しさん [2008/11/18(火) 12:09:47 ] <img width="120" height="180"> </img width="120" height="180"> <img width="120" height="180"/> という文字列をすべて width="120" height="180" width="120" height="180" width="120" height="180" にしたいのですが秀丸の置換で 検索→.* (.*)[/>].*$ 置換→\1 とやってるのですが width="120" height="180" width="120" height="180" width="120" height="180"/ と、さいごのスラッシュが消えません。 是非助言をください!・・・もう何時間もやってるんです(汗
452 名前:デフォルトの名無しさん [2008/11/18(火) 12:14:47 ] .* (.*?)[/>].*$ でいけました!お手数おかけしました!
453 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 09:31:33 ] とても大変だと思うのですが、よろしくお願いします。 ●正規表現の使用環境 Windows上で動く「Perl5の正規表現と互換性のある」とマニュアルに書いてある フリーの(今はシェアになっています)クリップボード拡張ソフト マニュアルには、参考事例として ・複数行のテキストに含まれている空白記号をすべて削除する [@ s/[ ¥t ]//gmk] ・複数行のテキストに引用記号をつける [@ s/^/> /gmk] などが書かれています。 ●検索か置換か? 置き換え です。 ●説明 窓の杜などからソフトウェアのファイルをダウンロードするときに、 そのソフトをレビューした記事のタイトルをダウンロード先フォルダの名前にしています。 しかし、記事からタイトルをコピーして、フォルダ名としてペーストするだけでは 「ファイル名には次の文字は使えません。」という警告をWindowsから受けてしまうことが頻繁にあります。 Windowsでフォルダ名に使えない文字を削除しつつ、無意味な連続する空行を削除し、 ペーストしただけでフォルダ名として使える文字列へと変換できる正規表現を考えていただけないでしょうか?
454 名前:453 mailto:sage [2008/11/20(木) 09:34:37 ] ●対象データ1 「改行」 Moo0 オーディオ再生器「改行」 コンパクトで軽快に動作し、直感的に操作できるオーディオプレイヤー「改行」 「改行」 for Windows「改行」 ●希望する結果1 (フォルダ名に改行を使えないので、全ての改行をアンダースコアに置き換えつつ1行の文字列へ) _Moo0 オーディオ再生器_コンパクトで軽快に動作し、直感的に操作できるオーディオプレイヤー_for Windows (先頭のアンダースコアはあってもなくても構いませんが、無い方がうれしいです) ●対象データ2 シンプルかつ高機能な音楽プレイヤー foobar2000 バージョン【0.9.5.6】 ●希望する結果2 (ここまでの変換に加え、連続する空白、TABをひとつのアンダースコアに置き換えつつ、さらに末尾の空白を削除) シンプルかつ高機能な音楽プレイヤー_foobar2000_バージョン【0.9.5.6】 ●対象データ3 (○アールはregistration symbolと呼ぶらしい丸の中のRなのですが、打てませんでした。) 1. Intel○アール Graphics Media Accelerator Driver for Windows* XP (exe) (20476KB) 14.36.4.5002 2008/10/24 ●希望する結果3 (ここまでの変換に加え、registration symbolを(R)へ、フォルダ名に使えない文字/をハイフンへ) 1.Intel(R) Graphics Media Accelerator Driver for Windows* XP (exe) (20476KB)_14.36.4.5002_2008-10-24
455 名前:453 mailto:sage [2008/11/20(木) 09:35:51 ] なお、Windowsでフォルダ名に使えない文字列は \ / : , ; * ? " < > | および 改行 とのことなので、これらを含まない形へ整形できたらと思います。 これらを一度に処理することが、正規表現で可能なのかどうかも分からないのですが、 もし、できそうなら、どなたか編み出してもらえないでしょうか? よろしくお願いします。
456 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 13:49:38 ] とりあえず、 s/[\\\/:,;*?"<>|]/_/g みたいな。細かい改良点は自分で考えなよ。
457 名前:デフォルトの名無しさん [2008/11/23(日) 00:32:05 ] ………[2バイト文字][改行] [2バイト文字] ↑このパターンを ………[2バイト文字][2バイト文字] にするにはどう書けばよいでしょうか?
458 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 02:19:43 ] s/\n//
459 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 02:39:08 ] >>457 テンプレくらい読め。 それにそんだけじゃ情報が足りなすぎだ。 どうせ元データは何百行とあるんだろう? どういう行とどういう行を連結したいのか位は明確にしろ。
460 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 05:14:10 ] ●正規表現の使用環境 Devas 3.4 ●検索か置換か? 置換 ●説明 各行先頭にある 空白4つと数字(1から85)、ピリオドを抜き出したい 例えば 1. 120.136.16.13:3128 2. 94.178.64.37:48018 79. pps.nntime.com:554 このようなIP+Portの前にある文字列のことです。 ●対象データ 1. 85.
461 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 05:28:19 ] ^ *\d+\. もし空白やドットが不要で通し番号だけ拾うのなら、 ツールにもよるけど ^ *(\d+)\. とか適当にアレンジして試しておくれ
462 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 06:36:22 ] >>460 それ、置換なの?
463 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 10:02:54 ] >>461 ありがとうございました! ^ *(\d+)\. これでIPとPortだけに置換することができました。
464 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 15:26:32 ] よろしくお願いします。 ●正規表現の使用環境 Flexible Renamer(Perl5互換) ●検索か置換か? 置換 ●説明 ファイル名の一部を別の位置へ移したい。 ●対象データ (日付)(場所)hogehoge というフォルダ名や (日付)(場所)hogehoge,jpgというファイル名 ●希望する結果 (日付)hogehoge(場所)や(日付)hogehoge(場所),jpgというようにしたい。
465 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 15:29:21 ] その日付や場所を特定するための法則は?
466 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 15:41:40 ] それぞれ 「()」 でくくってあります。ともに一緒の括弧だとまずかったりしますか?
467 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 15:56:36 ] ああ、その括弧は実際も括弧だったのねw
468 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 16:03:16 ] >>464 s/^(\(.+?\))(\(.+?\))(.+)(\..+)?$/$1$3$2$4/
469 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 16:43:45 ] ありがとうございます。 自分の悩んだ時間などウソのようにすっきり成功してしまいました。 今までも正規表現を使いたいと思って色々サイトを巡ったのですが 今回の答えも答えをもらって、見れば分かるぐらいの理解しかないのです。 良い学習サイトなどがあれば教えてくれませんか?それともオライリーの本を買うべき?
470 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 16:45:58 ] >>469 俺はこのスレでROMって勉強してる
471 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 16:47:49 ] とりあえずソフバンあたりで出してる入門書でもいいから 一冊読んだ方がその後が楽になる
472 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 17:29:37 ] >>468 が理解できるのなら、正規表現の基本はできてる気がする。 (カッコのエスケープ、最短マッチ、後方参照あたり) もしプログラミングの経験がなければ、そっちを補ったほうがいいと思う。 正規表現も一緒に学べる『初めてのPerl』『たのしいRuby』あたりお勧め。 リネーマーも自分で作れるよ。
473 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 17:49:46 ] おお、このスレの人は優しい人ばかりですね。 プログラムはPHPぐらいで、しかも正規表現がどうしても必要な場面に 遭遇した事がありません。 これからこのスレをROMったり、挙げてもらった本も入門書のようですので 探して見て勉強してみようと思います。 ありがとうございます。
474 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 10:49:00 ] ■質問 2ch のレスの >>*** を、テキストエディタを用いて #aa(){{{>>***}}} に置換したいのですが、方法はありますでしょうか?
475 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 10:56:30 ] >>*** のうち、どれが固定でどれが可変なのか区別がつかないと答えられない。 もし全部固定なら、そのままエディタの置換機能を使えば済む。 >>5 を見て、対象データの例と希望する結果を書いてくれ。
476 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 12:56:55 ] >>475 ありがとうございます。わかりにくい表現で申し訳ありません。 ↓が対象データの例と希望する結果です。 ●対象データ >>123 >>456 ●希望する結果 #aa(){{{>>123 }}} #aa(){{{>>456 }}}
477 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 13:01:41 ] >>476 検索 >>(\d+) 置換 #aa\(\)\{\{\{>>$1\}\}\}
478 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 13:18:38 ] 置換後の文字列が↓のようになってしまいました。 $1 のところを \d+ や (\d+)、$\d+、$(\d+) に変えて色々やってみましたが ダメでした。置換には EmEditor Pro 7.02 を使っていますが、 何かやり方が誤っているでしょうか? #aa(){{{>>$1}}} #aa(){{{>>$1}}}
479 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 13:37:14 ] それはソフトの使い方を読むか、サポートに聞け
480 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 14:31:04 ] >>478 後方参照を $1 ではなく \1 で行う 置換 #aa\(\)\{\{\{>>\1\}\}\}
481 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 14:49:18 ] >>480 お返事遅れました。 すっげwマジで出来たw 正規表現って本当にすごいですね。 自分は \t や \n 等、基本的なものしかわからなかったのですが、 今回の質問が非常に勉強になりました。 次に疑問が湧いた時には、正規表現でできないことはないという姿勢で 解決に望もうと思います。 ありがとうございました。
482 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 14:49:51 ] >>480 その括弧のエスケープはなんかいみあるの?
483 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 14:55:12 ] ■追記 ちなみに、今回の置換の目的なのですが、 atwiki という wiki のページで > のような特殊文字を書くと、 適切に表示がされない不具合(?)があるので、 アスキーアート表示用のメソッド #aa(){引数} を用いて、> を囲みたいなと思ったのが目的でした。 初めは手動でやっていたのですが、あまりにも数が多いので 置換化できないかな、と思った次第です。 長文失礼いたしました。
484 名前:480 mailto:sage [2008/11/29(土) 15:01:52 ] 置換文字列なので無いw 置換 #aa(){{{>>\1}}} こうだね。 吊ってくる
485 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 16:21:23 ] >>482 ,484 小かっこ () って、正規表現モードでも \ をつける必要ないんですか。 勉強になりました
486 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 16:29:35 ] >>485 置換文字列は正規表現じゃないというだけ。 正規表現で書かなきゃいけないところで()そのものを書くには エスケープする必要がある。
487 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 13:46:28 ] ●正規表現の使用環境 .NET FrameworkのRegexクラス。 ですが、Perlなどの正規表現でもかまいません。 ●検索か置換か? 検索です ●説明 エスケープ記号(\)がついていない括弧で囲まれた文字列の検索が目的です。 [^\\]\((?<content>[^\(]+[^\\])\)という正規表現で試したところ、 入力文字列"a(b)"で正しくマッチし"a\(b)"や"\(b)"で正しくマッチしないのですが、 "(b)"では本来マッチしてほしいのにできなくなります。 ●対象データ エスケープ文字がついてないカッコで囲まれた文字列 ●希望する結果 マッチ: "a(b)", "(b)" 非マッチ: "\(b)", "a\(b\)", "a(b\)"
488 名前:487 mailto:sage [2008/11/30(日) 14:12:51 ] 申し訳ありません。(^\(|[^\\]\()(?<content>[^\(]*[^\\])\) で解決しました。
489 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 14:16:29 ] /(?<!\\)\((?<content>.*)?(?<!\\)\)/
490 名前:デフォルトの名無しさん [2008/12/03(水) 17:36:22 ] aaa777 あああああ aaa778ああああ aaa7 aaa7あああ aaa7aaa8 aaa7 aaa8 目的はaaa7をbbb7に置き換えたい。 しかしマッチ方法で苦しんでいます お助けを・・ /aaa7/ これでは全部置き換わる /aaa7[^\d]/これでは 下の3つが余計な部分含めてマッチしてしまう。。 下から4つ、aaa7のみマッチさせる方法はあるでしょうか。 www.rider-n.sakura.ne.jp/regexp/regexp.php ここで簡単に調べられるのですが宜しくお願いします。 Perl互換の正規表現にチェックをいれていただけるといい感じです。
491 名前:デフォルトの名無しさん mailto:sage [2008/12/03(水) 17:46:49 ] >>490 /aaa7(?=[^\d])/ 次からは>>5 でお願い。
492 名前:デフォルトの名無しさん mailto:sage [2008/12/03(水) 17:48:08 ] aaa7(?=[^\d]|\Z) そのチェッカーとやらの使い方がよくわからんので試してないが。 (?=ほげ) で先読みが、\Z で改行または文字列末にマッチ、ができることを 前提としている。 何を使っているのかよくわからないが(PHPのPerl互換モード?) 先読みと改行と文字列末の扱いを確認してみること。
493 名前:デフォルトの名無しさん mailto:sage [2008/12/03(水) 17:50:47 ] よく考えたら /aaa7(?!\d)/ でよかった。
494 名前:490 mailto:sage [2008/12/03(水) 18:28:57 ] >>491 もうしわけないです次から気をつけます。 >>491-493 ふむふむ 先読みという事ができるのですね 結果うまくいきました!ありがとうございました。 先読みと改行と文字列末 これを詳しく勉強してみます。
495 名前:デフォルトの名無しさん mailto:sage [2008/12/03(水) 18:31:18 ] よくそれだけで答えられるな こう読んだけど違うのかな s/aaa(?=7)/bbb/ >>494 が来てたのでもういいみたいだけど
496 名前:492 mailto:sage [2008/12/03(水) 18:47:11 ] [^\d] は \D でよかったな。 >>495 aaa777 にもそれだとひっかかるよね? それにはひっかけたくないらしかったから。
497 名前: mailto: [2008/12/05(金) 00:09:56 ] ()() [][] {}{}
498 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 21:09:48 ] ふらっとC#,C♯,C#(初心者用) Part34 ttp://pc11.2ch.net/test/read.cgi/tech/1227521785/607 から来ました C#でRegexを使って正規表現を利用しています if (Regex.Match(" Xxxxxxxxx.xxxxxxxxxxxxxx.xxxx", @"\s+((\w+\.?)+)$").Success) { Console.WriteLine("True!"); } else { Console.WriteLine("False!"); } Console.WriteLine("カンマあり"); if (Regex.Match(" Xxxxxxxxx.xxxxxxxxxxxxxx.xxxx,", @"\s+((\w+\.?)+)$").Success) { Console.WriteLine("True!"); } else { Console.WriteLine("False!"); } マッチする場合は後で ((\w+\.?)+)$ の部分について処理をして、マッチしない場合はそのまま次にいくようにしたいのですが このパターン文字列だと上記のような文字列でカンマが末尾にある場合はfalseが返ってくるまで異常に時間がかかってしまいます 最終的に ((\w+\.?)+)$ 出マッチする場合とと同じ文字列が得られる、末尾にカンマが合っても処理が遅くならないパターンがあれば教えてください
499 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 22:50:00 ] >>498 (\w+)+ みたいな感じになるから遅いんだろうねえ。 \s+\w+(\.\w+)*$ でどうか。
500 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 22:50:51 ] キャプチャするから \s+(\w+(\.\w+)*)$ こうか。
501 名前:498 mailto:sage [2008/12/06(土) 23:56:46 ] >>499 ,500 ありがとうございます、見違えるように早くなりました (\w+)*は良くても(\w+)+は遅くなるんですね
502 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 03:52:21 ] >>501 > (\w+)*は良くても(\w+)+は遅くなるんですね んー、そういうことではないぞ。 \.? は有っても無くてもいいけど、(\.\w+)* の \. は必要でしょ。 (\.?\w+)* にしたらやっぱり遅くなるはず。 (\w+\.?)+ は「.xxxxxx」だけにも何通りもマッチの仕方があるけど、 (\.\w+)*は1通りしかマッチできない。この違いだよ。
503 名前:498 mailto:sage [2008/12/07(日) 10:07:49 ] >>502 ? と +(もしくは*) の組み合わせが最悪だったわけですか 今度から注意します
504 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 13:53:02 ] >>503 なんかまだ誤解してるっぽいな。 *)* みたいに、カッコの内側の最後に繰り返し指定(*やら+やら)があって、 その外側すぐにも繰り返しがあるのが問題(になることが多い)。 498が最初に書いたようなマッチしないデータを食わせたときに、 バックトラック回数がとんでもなくでかくなって遅くなる(可能性がある)。
505 名前:498 mailto:sage [2008/12/07(日) 15:05:16 ] >>504 理解が遅くてすみません、ようやく分かりました 丁寧にありがとうございました
506 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 20:39:26 ] 正規表現が手に入れた強力すぎる「構文理解(マッチ)能力」って、 外国語の翻訳に使えそうな気がするんだけど、その観点での研究って進んでないの?
507 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 21:38:53 ] そりゃ無理でしょ。 yaccやbisonで実用になる翻訳ソフトが作れるって話は聞かないから。
508 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 21:53:34 ] >>506 正則言語はそんなに広いクラスじゃないぞ
509 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 21:56:51 ] >>506 一般の自然言語と正規言語では言語のクラスとして天と地ほどの差があるよ。 たとえば、多くの自然言語は無限回のネストを許容するが、これは正規文法で表せない。
510 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 08:03:55 ] お前らちゃんと日本語話せよ何言ってるか分かんねぇよ
511 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 11:28:01 ] お前が勉強不足なだけだ。
512 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 11:45:24 ] なんて面白みの無い、むしろマイナスなレスなんだ
513 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 18:38:31 ] ●正規表現の使用環境 PHP4.4以降 ●検索か置換か? 検索後、個々に置換 ●説明 ユーザーが入力したhtmlデータ内に 特定の文字で囲まれたものを変換したい。 %test%や%nullpo%など。 ●対象データ フォームで送信されたhtmlデータ <html> <head> </head> <body> %adv% あいうえおかきくけこ<br> %adv% </bnody> </html> ●希望する結果 %adv%を発見した位置を返し、それを指定された文字列で置換する。 %adv%は全て同じではなく、別の文字をそれぞれ割り当てたい。 よろしくお願いします。
514 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 19:41:55 ] >>513 >%adv%は全て同じではなく、別の文字をそれぞれ割り当てたい。 この時点で、正規表現でやるのには無理がある。 状態を持つには何らかのプログラミング言語で。 HTMLならJavaScriptか。
515 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 21:03:49 ] PHP使ってるからテンプレートエンジン使ったらどうだろうか
516 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 02:35:21 ] よくわかんないけど、%date%→2008/12/12 %name%→田中みたいにして %name%様への%date%のお知らせです。 が 田中様への2008/12/12のお知らせです。みたいになるようにしたいんじゃないの? 正規表現っていうか普通に置換すればいいだけじゃないの?%name%→%date%とかなると置換順序によってはおかしくなるから、 そこは%name%を%date%で置換したいなら%%date%%と入力しといて後で%%を%に(ryみたいにすればいいと思うけど。 >>514 は何が言いたいのか良くわからない。 >>515 に同意。Smartyとか使えば全部やってくれるから楽だけど…
517 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 09:24:04 ] >>516 >%adv%は全て同じではなく、別の文字をそれぞれ割り当てたい。 この文章を素直に解釈すると、同じ「%adv%」でも状況に応じて 「こんにちは」にも「さようなら」にもなるって事じゃないのかな。 で、そういう状況依存的な内部状態を持つ操作は、 変数や条件判断文のあるプログラミング言語でないと不可能。 何か変?
518 名前:506 mailto:sage [2008/12/13(土) 22:59:58 ] >>507-509 正規表現の(現時点での)限界があることはわかりました。 が、自然言語の「(ある種の)典型的な表現」を滑らかに翻訳するという狭いクラスのタスクに対しては 正規表現がその強力な威力を発揮できると今でも思っています。
519 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 00:02:11 ] 限界とか威力とか意味わかんね。 正規表現なんて正規文法を別の記号で書き直しただけじゃん。 数学的に厳密な定義のあるものなんだから、 明日になって威力が変わったりしないよ。
520 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 02:58:28 ] 正規表現を、どんな夢でもかなえてくれる魔法の呪文とでも勘違いしてないか?
521 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 08:53:37 ] 文法の表現力では 正規文法 < 文脈自由文法 < 文脈依存文法 < 解析表現文法
522 名前:デフォルトの名無しさん [2008/12/15(月) 00:24:39 ] ABCを含まない行にマッチさせたい場合 ^(?!.*ABC) ←OK (?!.*ABC) ←NG となるのでしょうか? 上記の違いが分かりません
523 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 00:38:48 ] >>522 .*がABCを食うから。
524 名前:デフォルトの名無しさん [2008/12/15(月) 00:49:37 ] ^があるとなぜ食えないんですか?
525 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 01:52:03 ] /^(?!.*ABC)/の場合、まず/^/が文字列の頭にマッチする。 そこから後ろ(即ち元の文字列全体)が、/^(.*ABC)/にマッチしなければ、全体としてマッチする。 /(?!.*ABC)/の場合は、どんな文字列であっても末尾にマッチする。 なぜなら文字列の末尾から後ろ(即ち空文字列)は/^(.*ABC)/にマッチしないから。
526 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 15:17:08 ] >>517 あーなるほどね。1回目の%adv%では「こんにちは」、2回目の%adv%では「さようなら」にしたい、とかか。 そりゃ正規表現じゃ無理だわ。いや、限定的な状況ならいけるかもしれないけど。
527 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 12:11:49 ] 含まない行、のような指定は、できるなら -v オプションとか 正規表現より上のレイヤでやったほうがよい。
528 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 12:32:43 ] それはスレ違い
529 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 19:58:47 ] いいんじゃない? 正規表現だけでは何もできないんだから。 perl とか、テキストエディタとか、そのた言語と組み合わせないと。
530 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 22:12:40 ] perlとかテキストエディタとかその他の言語のサポートまではしてられないってことだろ。よう知らんけど。
531 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 01:43:09 ] >>527 はどこまで正規表現を使うべきかという立派な正規表現ネタに見えた。 正規表現で実現可能なことは無理してでも正規表現を使え なんていう愚かなスレでもないだろうw
532 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 09:10:18 ] 実用的な解と、パズル的な解か。
533 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 14:32:23 ] 例えば、 ABC と DEF という文字列があったとき、 ABCの場合 ABC (123) DEFの場合 DEF (345) という形に置き換えるのは可能でしょうか? また、可能ならどのように書いたらいいでしょうか
534 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 14:53:58 ] >>533 できる。正規表現は /ABC/ /DEF/ 意地悪はさておき、ABCやDEFを検出するのは正規表現だけど 置換をするのはそれぞれの「実装言語や処理系ソフトウェア」だから >>5 のテンプレ埋めてくれないと答えられない。
535 名前:533 mailto:sage [2008/12/22(月) 15:54:12 ] すみません 訂正します ●正規表現の使用環境 Jane Style Version 3.01 ●検索か置換か? 検索後に置換 ●説明 文字列にマッチさせた後、マッチした文字列ごとに指定された文字列を後ろに 追加させて置換させたい ●対象データ @ ABC A DEF ●希望する結果 @ ABC (123) A DEF (345)
536 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 16:25:00 ] 普通の置換でよくね?
537 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 16:51:55 ] すみません、説明が足りませんでした この二件だけの場合は二つ表現を書けばいいですが、 後ですぐに置換したい文字列を追加できるよう、(ABC|DEF)のように orか何かでまとめて作りたいと思っています それは可能でしょうか それともやはり一つ一つ書いたほうがいいでしょうか
538 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 17:24:29 ] >>537 まとめようにも法則性が無いが。
539 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 17:27:44 ] てか、Jane Style って専ブラだよね? どういう機能で何をしようとしてるのかがわからないとどうにもアドバイスのしようが... (このスレは基本的には、grepやawkやPerlやPythonやJavaの正規表現のスレなので)
540 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 17:41:12 ] <rx2>(?<=ABC)[TAB] (123)[TAB]msg <rx2>(?<=DEF)[TAB] (345)[TAB]msg
541 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 20:35:21 ] これですね。ちゃんと書いてあります。 www.monazilla.org/index.php?e=65
542 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 21:36:27 ] >>538 あまり正規表現について詳しくないもので やはりちょっと無理がありましたね・・・ >>539 すみません 少し勘違いをしていました >>540 有難うございます! すごくスッキリしていていいですね 参考にさせて頂きます
543 名前:デフォルトの名無しさん [2008/12/27(土) 19:09:30 ] perl で abc-def-1234-ghi-jkl これから abc-def を取りたい 1234は数字が4文字です 1234の前を取るのはどうすればいいですか?
544 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 19:14:41 ] 「取る」とは? 「抽出したい」 → 結果として abc-def が欲しい 「削除したい」 → 結果として -1234-ghi-jkl が欲しい どっち? できれば >>5 を参考に。
545 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 19:31:16 ] もっと高級言語っぽい表記で書けるといいのになぁ。
546 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 19:31:35 ] (ちょっと変えました) prelで ●検索か置換か? 検索 ●説明 12-34は数字が2文字ハイフン2文字です (\d{2}-\d{2} こうかな?) 12-34の前を抽出するにはどうすればいいですか? 12-34の前の部分に数字が2文字は無いです。 ●対象データ abc3-d5ef-12-34-ghi-jkl ho-1ge=+-e67-89+fuga++--jkl ●希望する結果 abc3-d5ef- ho-1ge=+-e
547 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 20:59:42 ] >>546 12-34でもその一般化したパターンでも使ってマッチングさせてから 特殊変数 $` や@- を参照するなり他の手段で抜き出すなりすればよろしかろ?
548 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 23:26:09 ] >>546 カッコ ( ) をつかえばいいよ。
549 名前:デフォルトの名無しさん mailto:sage [2008/12/28(日) 11:20:42 ] >>546 print /(.*)(?=\d{2}-\d{2})/ ? "match:[$1]\n" : "unmatch.\n" for qw( abc3-d5ef-12-34-ghi-jkl ho-1ge=+-e67-89+fuga++--jkl );