Regular Expression(正規表現) Part14 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
Regular Expressionスレです。 質問する場合は必ず実装言語や処理系ソフトウェア名を示してください。 前スレ Regular Expression(正規表現) Part13 http://echo.2ch.net/test/read.cgi/tech/1415149975/ 次スレは>>980 宜しく 天ぷら等2以降 >>95 すごいできます!即レスありがとうございました!感謝です! ●Regular Expressionの使用環境 Bash on Ubuntu on Windows での sed ●検索か置換か? 置換 ●説明 [ と ] で括られた最初の文言以外を削除したい ●対象データ aaa[bbb]ccc [ddd]eee fff[ggg]hhh[iii]jjj kkk ●希望する結果 bbb ddd ggg 空行、もしくは、そのまま(上記だとkkk) cat hoge.txt | sed -e 's/.*\(\[.*]\)/\1/g' で行けそうな気がしたんですが、結果は [bbb]ccc [ddd]eee [iii]jjj kkk この有様。誰か助けてください。 cat test.txt | sed -E 's/[^\[]*(\[[^\[]*\]).*/\1/g' sedはnon-greedyサポートしてないので[^\[]*で "["以外の文字にマッチするように指定する >>98 cat hoge.txt | sed -e 's/\].*\|.*\[//g' これだと3行目が2つ目の [ ] のを拾ってしまった。 bbb ddd iii kkk >>99 cat hoge.txt | sed -E 's/[^\[]*(\[[^\[]*\]).*/\1/g' [bbb] [ddd] [ggg] kkk 狙い通りのが拾えました。[ ] が付いてくるけどそれは自分で外します。 どうもありがとうございました。 「Regular Expression」ってことは RegularじゃないExpressionもあるのかな? >「irregular expression」に関連するキーワード > >保守速報 ワロタ >>101 正規表現で表される集合の標本それぞれが正規でない表現じゃないの >>104 なるほどおおおおぉぉぉ!!! 合点がいきまくりんぐです。ありがとうございます! ●Regular Expressionの使用環境 サクラエディタ ●検索か置換か? 検索 ●説明 「ABC」の英大文字と小文字を区別せずに検索したいのですが 書き方はあるのでしょうか? 今は『abc|Abc|ABC』という正規表現を使っていますが 書くのがめんどうだし、aBcやabCにもヒットさせたいので もっと簡潔な書き方があれば教えて下さい。 >>108 (?i:ABC) で行けるんではなかろうか そのものズバリのチェックボックスがあるのに釣りかメクラか >>110 すみません、実はJaneStyleなど複数の環境で正規表現を使っていて、一番よく使うサクラエディタを例に出してしまいました。 確かにサクラエディタだと「英大文字と小文字を区別する」ってチェックがありますよね・・・ >>109 ありがとうございます!バッチリいけました。 >< ●Regular Expressionの使用環境 テキストエディタMeryでの強調文字列指定について質問です http://www.haijin-boys.com/ Onigmo (Oniguruma-mod) (regular expression library) 5.15.0 https://github.com/k-takata/Onigmo ●検索か置換か? 検索? ●対象データ "D:\PATH\HOGE",1,307,,0,"15/01/01 00:00:00","12/12/31 00:00:00",1,1,,,,"著者X",,,,,"タイトルA",,,2,,,,,1,1101,1101 "D:\PATH\FUGA",,,,,,"15/02/01 00:00:00",1,1,,,,,,,,,"名前B",4,,0 "E:\FOLDER\PIYO",20,197,91,0,"16/03/01 00:00:00","15/04/01 00:00:00",1,1,,,,"著者Y,Z","出版社",,,,"題名C" ●希望する結果 上のようなテキスト各行の最後に出現するダブルクォーテーション囲いの文字列 "タイトルA" "名前B" "題名C" を取得して強調表示したいのですがどのような正規表現で記述すればよいのでしょうか? あるいはダブルクォーテーションを含まない状態(タイトルA、名前B、題名C)でも差し支えありません ●説明? ・各行でカンマや "" 囲いの数はまちまちで、"" 囲いの中にカンマがある場合もあります ・"" 囲いの中のカンマを無視した場合、17番目のカンマの直後の "" 囲い部分です ・"タイトルA"、"名前B"、"題名C"のあとに続く文字列の長さ、形式は不定です ・対照データはマンガミーヤのブックリストです よろしくお願いします "[^"]*"(?=[^"]*$) (?<=")[^"]*(?="[^"]*$) >>113 両方のパターンを教えていただきまして、ありがとうございます "フォルダパス" の "[A-Z]:\\.+?" と "年/月/日 時:分:秒 "の "../.+?" タイトルフィールドだけは全/半スペースで字下げして "[ ]+.+?" というパターンまでは作れましたが 字下げなしで強調表示できるようになり、一層見分けやすく、編集しやすくなりました なぜこれらが最後の "タイトル" 部分にマッチするのか、まだ理解できてはいないのですが 読み解けるように頑張ってみます 先読みと後読みの使い方をなんとなく理解できるようになったかも?という感じで、自分で同じ表現をすぐに導き出せるかとなるとまだまだ難しそうです 調子にのって後読みで12番目のカンマの後ろの "著者" にマッチさせようとやってみましたが、繰り返し表現をふくむ後読みはダメだとか… ^".+?"([^,]*,){12}".+?" で「行頭から"著者"まで」はできても ^(?<=".+?"([^,]*,){12})".+?" では機能しないんですね あれこれ弄り回して "タイトル" からカンマ5つ戻るかたちで先読みにして "[^"]*"(?=(,[^,]*){5}"[^"]*"(?=[^"]*$)) にしたら "著者" に 同様に {4} で "出版社" にマッチしました おかげさまで色々と勉強になり、あらためてありがとうございました こんな古代呪文みたいなの、実際に仕事とかで使ってないとなかなか覚えないし 覚えてもすぐ忘れてしまうよなw 全てのパターンを記憶して空で完全詠唱できる人なんているんだろうか? 暗唱できる必要性があるのか? 使うときにそういうのがあったなあって思う出すだけでいいだろ あとは詳細を見て使えばいいだけ 仕事じゃなく趣味で覚えたけど 間違いなく覚えた方が便利 どっかに正規表現化してるだけでお金貰える仕事ないかな >>116 わたしレベルになると詠唱破棄すら可能w 言語環境ごとに使える使えない、エスケープ必要不必要を間違えたりする サポートしてない環境の多い先読みとかは他の手段使っちゃったりするからなかなか使いこなせない $1 と \1 を間違えて泣きをみて以来、むしろ記憶しないようにしている……・ コマンドプロンプトのfindstrコマンドで使えるやつより貧弱な正規表現環境なんてないよね? >>118 とある地方の区画整理の際、住所表記が変わるので 住所を正規化するために正規表現と簡単なDB処理とを組み合わせた 単純な処理を行うだけの1日仕事で、 そこらのリーマンの3ヶ月分ぐらいお金になった事とかあったな 仕事柄色んな会社を訪問するけど テキストの簡単な置換すらできない(まずテキスト置換という概念を知らない)人って 事務程度でしかパソコン使わない人にはめちゃくちゃ多いんだよね そんなに人達に (.+)abcd\n みたいな初歩的な正規表現を教えると 物凄く驚かれる 見下すようだけど世の中そんなもん >>128 まぁハードル高いよね、低くないと言うべきか 知らなきゃ「正規表現」というチェックボックスがあっても、それが何をするものなのか 言葉から具体的イメージが全く湧かないし ヘルプ見てはじめて何をするものなのかわかるという、といっても具体例が 無ければヘルプ見たところで「難しそう>便利そう」になりがち 一目で「難しそう<便利そう」になるならとっくに正規表現を使ってる層だろうし ファイルの検索 や excel や word や メモ帳 、IE、Edge あたりに正規表現が 最初っからあれば話は違ってくるんだろうなと Mac触った事ないからアレだけど、Macなら充実してるのかしら? >>129 システム屋やってる人間からしても正規表現って見るからにとっつきにくそうだもんな。 システム会社なのに知らない人間の方が多いというw >>130 えー プログラム組む人種なら例外なく好物だと思ってたんだが(^^;; 使い捨てコードといったらPerlで書いてた世代は正規表現に抵抗無さそう >>131 VBとかでポチポチやってる人は嫌いそう GUIで書けるいいツールがあったら広まるかもね 小さな会社だと他より少しPC関連に詳しいってだけでIT部長とか言われこき使われる 勿論そんな役職なんて無い 正規表現なんて言葉を発したらセクハラだの変態だの言われかねん >>135 正規表現で置換 とか知らない人が聞いたらアレだもんなw >>133 正にその世代だけど 昔のperlは正規表現抜きでも変態記法満載だったから だんだん昔のコードは読めない人が増えてきてる $line =~ s/(?:\x0D\x0A|[\x0D\x0A])?$/,/; @values = map {/^"(.*)"$/s ? scalar($_ = $1, s/""/"/g, $_) : $_} 10年ぐらい前のメモからのコピペだけど見ただけで目眩がするw >>132 一概にシステムといっても色々あるからね 機器制御系システムなんかだと正規表現を使う機会なんてまず無いだろうし WEB系の事やってるなら何だかんだで正規表現を使う機会はそこそこあるだろうし CSV は、" などのエスケープについて、様々な方言があるから、正規表現では無理。 CSV の方言・規格を確定させてから、Ruby を使うべき バグのほとんどが設計段階・仕様で生じる。 方言さえ確定していれば、バグらない >>135 会社の忘年会では正規表現やりますって言ってパンツ脱ぐのか? >>138 仕事内容にもよるけどそんな事はない なんせ世の中にはExcelのデータが糞ほどあるので 「Excelルールのcsvを正規表現で処理する+α」の仕事だけでも たぶんそこらのリーマンよりは稼がせてもらってきたよ 日本の企業の大半は中小企業なわけだけど ほんと信じられないほど無駄な事やってる会社がたくさんあるからね こんな時間に2chなんてやってられるのも、そのお陰ですわ >>138 Rubyを使うべき、と言う唐突な結論以外は同意できる。 Ruby (のようなスクリプト)を使うべきなら完全に同意できたのに。 >>142 少し日本語は下手だが、 事前にCSV の方言・規格を確定すべし という主張と読んだ。 なぜrubyなのかよく分からん 多少正規表現エンジンの種類やバージョンの違いはあれど 正規表現はperlでもPHPでもJavaScriptでもPythonでも使えるし rubyの正規表現なんて昔はコールバック処理するのがくそ面倒だった筈だが 正規表現を使わずにrubyでやれと言いたいのでは まあ確かにrubyは標準で簡単強力なcsv処理ができるけど ruby以外でのcsvの処理の仕方を知らない知識不足な人の戯言にしか見えない >>144 たぶんrubyのような言語と言いたかったのだと推察致しまする >>134 VB(今時は.NET)では入力チェックとかでよく使うからお前の偏見だよ。 >>134 いい忘れたがサクラのマクロもよく使う。 >>148 VBやってるやつが皆そうやってると思うか? それこそ偏見だ そもそもテキスト処理じゃないと使わんよ 使う使う言う奴はプログラミングの分野が偏ってるんじゃないか? エンドユーザーに近い分野で使うというより、開発者が使うものでしょ。SQLとかと同じ。 >>153 そりゃプログラムから使うものだから開発者しか使わんよ そう言う意味じゃなくて利用者が入力した値の妥当性確認とかに使うケースが多いんじゃね? って話なんだろ >>157 特殊? そう言うなら他にもっと使われてる用途挙げてくれ 検索じゃろ grep然りsed然りエディタの検索然り >>159 その辺りもエンドユーザー(多くは開発者だと思うけど)に近いところじゃね? 一般に正規表現自体をどこで使うかの話と違うんか? プログラマがどこで使うかって文脈に限定してるのんか? perlがそうであったようにログ読んだり整形したりするときにも良く使う。システム管理者。 プログラマによっては無理に正規表現使わないで正規表現を引数に取らないcontainとか複数行で書くって人もいるんじゃないか。入力チェックもそんな考えるような正規表現の出番少ないような。 perlくらい言語に組み込まれてるならともかく。 正規表現、難しいですね…全然わかりません お知恵をおかし下さい 例えば test = "//abc"; // コメント "です" という一行があった場合、後半の // コメント "です" にだけマッチする正規表現はどのように書いたらいいんでしょうか? 最初は /(?!.*(\"|\'))\/\/(.*)/ こんなカンジで否定的先読みを利用していたのですが、 コメント部にも、 シングル及びダブルクォーテーションが入る可能性が出てきたので、 この書き方では ?! で否定しているためなのかマッチ出来ません。 何か良い書き方はありますでしょうか? やりたい事は、PHPなどで、javascriptのソースから単一行のコメントを削除したいです。 よろしくお願い致します。 PHP は知らん $perl -ne 'm%((?:\".*?\"|/(?!/)|[^/])*)(.*)% ; printf("<$1> <$2>\n");' test = "//abc"; // コメント "です" <test = "//abc"; > <// コメント "です"> // コメント "です" <> <// コメント "です"> $ 末尾方向から、// を探して、もしあれば、その行を選択する。 ^.*\/\/(ここに、2連続以上の、/ が存在しない)$ /// 例えば、3連続でも、コメント扱いするよな? test = "///abc"; /// コメント "です" シングルクォーテーションは、どうするんだ? test = '///abc'; /// コメント "です" javascriptだから、シングルダブルは同等機能 "'"とか'"'とか有だし "\""とかのエスケープもある "//abc"は文字列だし、"\""//abc"はコメント みなさん、ありがとう御座います! 165さんの短いのでサクっと出来ました! なるほど、末尾から検索をかけるとう考えなんですね。 本当に奥が深くて、使いこなすのは難しいです… いろんなパターンを作りだし、自由にマッチ出来るよう精進します >165-167さん、ありがとう御座いました! >168さん抜けちゃいました(汗 ありがとう御座いました! >>169 ツッコミか逆ギレ待ちだったんだが… 165ではコメントが無くてコード中に//がある場合にそのコードの部分にマッチする 削除だとコードを削ってしまうよ コード中に//が無い場合、またはコード中に//がある場合にその後ろにコメント行がある場合、限定 マトモなのは「JS コメント 正規表現」とかのワードでggr s#((?:"(?:\\\\|\\"|[^"])*+"|'(?:\\\\|\\'|[^'])*+'|/(?!/)|[^/])*+)(.*)#<$1>\t<$2># >>171 え!? 限定的なテストで、思ったとおりの動きをしたので、おお!すげー!って思ってました… 実際のスクリプトには、まだ組み込んでないので気付きませんでした 他の方が書かれてた方法も試したり、ググってみますね 区切り記号 ; や閉じ括弧 } のあとにスペースかタブいくつかの後に来る // から行末をコメントと見なすのが簡単? コメント化は、プログラムデバッグ中にも命令を無効にするために使うこともあるし、ことはそう簡単じゃないよ //if(hoge=="http://hoge.net" ;) {//コメント これは、無限の組み合わせがあるから、正規表現じゃ無理 AST変換とか、LLVMでコンパイル後の命令木をもらって、 コメント部分を削除するとかしないと、自力じゃ無理なレベル こんな場合もあるからね /* 一行コメントを外す //*/hoge="abc"; テキストから 06/03( を抽出する場合、どんな表現になりますか? 何それ限定なの? 06\/03\( (スラッシュにエスケープが要らない場合もあるけど付けといてダメなことはない) >>181 sedのsなんかは(をエスケープすると特別な意味を持つんじゃ 正規表現って本当に色々なパターンでテストしないと抜けがあったりするから怖いね >>183 それは仕様を理解していないから。 正規表現で表現してあるパターン以外にマッチする事はないんだから、 抜けがあるならパターンの意味を理解していないって事 >>184 仕様を理解してたらバグがないって? w 非欲張り、欲張り、強欲の違いが分からなかったんだけど ttp://d.hatena.ne.jp/atzy/20110309/p1 これ読んでやっと分かった こりゃエディタの検索で試してるだけじゃ理解出来なくて当然だね 誰か同じように例を交えて先読みと戻り読みのロジックを解説して欲しい それか解説してるwebページがあるならリンク貼って下さい ●Regular Expressionの使用環境 秀丸 HMJRE.DLL V5.00 ●検索か置換か? 置換 ●説明 文章最後の文字からEOFまでの 空白(全角半角両方) タブ 改行 を消したい。 ●対象データ AAAAA BBBBB CCCCC [EOF] ●希望する結果 AAAAA BBBBB CCCCC[EOF] [ \s]*(?!\n)$(?#maxlines:99999999) >>187 Qiitaなのでコメントまで必ず読むこと 正規表現の先読み/後読みを「絞り込み」と理解してみる - Qiita http://qiita.com/blackenedgold/items/382704cc54c8e42819d0 [コラム] 正規表現の先読み/後読みは、どう考えても名前が悪いので、呼称禁止令を出してルックと気軽に呼んでみませんか。 - Qiita http://qiita.com/mochizukikotaro/items/84f3ab2740b8efbe0dc6 後者は日本語表現のネタモノなので理解にはあまり役に立ちませんが そもそも「正規表現」が誤訳だし 「先読み/後読み」がどうだって驚かない ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる