X



Regular Expression(正規表現) Part14 [無断転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
垢版 |
2017/03/15(水) 02:04:35.47ID:e01p03UP
Regular Expressionスレです。

質問する場合は必ず実装言語や処理系ソフトウェア名を示してください。

前スレ
Regular Expression(正規表現) Part13
http://echo.2ch.net/test/read.cgi/tech/1415149975/


次スレは>>980宜しく
天ぷら等2以降
0097デフォルトの名無しさん
垢版 |
2017/05/04(木) 02:53:36.15ID:P+e+GY0n
●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
この有様。誰か助けてください。
0099デフォルトの名無しさん
垢版 |
2017/05/04(木) 03:22:48.12ID:7TNYL3q7
cat test.txt | sed -E 's/[^\[]*(\[[^\[]*\]).*/\1/g'

sedはnon-greedyサポートしてないので[^\[]*で
"["以外の文字にマッチするように指定する
0100デフォルトの名無しさん
垢版 |
2017/05/04(木) 10:29:51.92ID:P+e+GY0n
>>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

狙い通りのが拾えました。[ ] が付いてくるけどそれは自分で外します。
どうもありがとうございました。
0105デフォルトの名無しさん
垢版 |
2017/05/07(日) 07:31:07.21ID:fOF53fEF
そもそも誤訳だし
0106101
垢版 |
2017/05/07(日) 16:34:35.27ID:fwX9OlSY
>>104
なるほどおおおおぉぉぉ!!!
合点がいきまくりんぐです。ありがとうございます!
0107デフォルトの名無しさん
垢版 |
2017/05/13(土) 23:19:52.64ID:4xoUv3bU
書き込めない?
0108デフォルトの名無しさん
垢版 |
2017/05/14(日) 17:21:45.80ID:IUk17Lsy
●Regular Expressionの使用環境
サクラエディタ

●検索か置換か?
検索

●説明
「ABC」の英大文字と小文字を区別せずに検索したいのですが
書き方はあるのでしょうか?
今は『abc|Abc|ABC』という正規表現を使っていますが
書くのがめんどうだし、aBcやabCにもヒットさせたいので
もっと簡潔な書き方があれば教えて下さい。
0111デフォルトの名無しさん
垢版 |
2017/05/14(日) 20:19:12.83ID:IUk17Lsy
>>110
すみません、実はJaneStyleなど複数の環境で正規表現を使っていて、一番よく使うサクラエディタを例に出してしまいました。
確かにサクラエディタだと「英大文字と小文字を区別する」ってチェックがありますよね・・・

>>109
ありがとうございます!バッチリいけました。 ><
0112デフォルトの名無しさん
垢版 |
2017/05/27(土) 19:51:02.34ID:gdXMy//z
●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"のあとに続く文字列の長さ、形式は不定です
・対照データはマンガミーヤのブックリストです

よろしくお願いします
0114112
垢版 |
2017/05/28(日) 07:52:06.42ID:5aByZaI0
>>113
両方のパターンを教えていただきまして、ありがとうございます

"フォルダパス" の "[A-Z]:\\.+?" と "年/月/日 時:分:秒 "の "../.+?"
タイトルフィールドだけは全/半スペースで字下げして "[  ]+.+?" というパターンまでは作れましたが
字下げなしで強調表示できるようになり、一層見分けやすく、編集しやすくなりました

なぜこれらが最後の "タイトル" 部分にマッチするのか、まだ理解できてはいないのですが
読み解けるように頑張ってみます
0115112
垢版 |
2017/05/28(日) 11:31:39.10ID:5aByZaI0
先読みと後読みの使い方をなんとなく理解できるようになったかも?という感じで、自分で同じ表現をすぐに導き出せるかとなるとまだまだ難しそうです

調子にのって後読みで12番目のカンマの後ろの "著者" にマッチさせようとやってみましたが、繰り返し表現をふくむ後読みはダメだとか…
^".+?"([^,]*,){12}".+?" で「行頭から"著者"まで」はできても ^(?<=".+?"([^,]*,){12})".+?" では機能しないんですね
あれこれ弄り回して "タイトル" からカンマ5つ戻るかたちで先読みにして "[^"]*"(?=(,[^,]*){5}"[^"]*"(?=[^"]*$)) にしたら "著者" に
同様に {4} で "出版社" にマッチしました

おかげさまで色々と勉強になり、あらためてありがとうございました
0116デフォルトの名無しさん
垢版 |
2017/05/28(日) 12:13:46.77ID:IsUf2Pl+
こんな古代呪文みたいなの、実際に仕事とかで使ってないとなかなか覚えないし
覚えてもすぐ忘れてしまうよなw
全てのパターンを記憶して空で完全詠唱できる人なんているんだろうか?
0117デフォルトの名無しさん
垢版 |
2017/05/28(日) 13:15:52.74ID:QUomuFPF
暗唱できる必要性があるのか?
使うときにそういうのがあったなあって思う出すだけでいいだろ
あとは詳細を見て使えばいいだけ
0118デフォルトの名無しさん
垢版 |
2017/05/28(日) 13:26:02.06ID:35oU3ReV
仕事じゃなく趣味で覚えたけど
間違いなく覚えた方が便利

どっかに正規表現化してるだけでお金貰える仕事ないかな
0120デフォルトの名無しさん
垢版 |
2017/05/28(日) 16:06:45.06ID:MqtJ47ff
言語環境ごとに使える使えない、エスケープ必要不必要を間違えたりする
サポートしてない環境の多い先読みとかは他の手段使っちゃったりするからなかなか使いこなせない
0121デフォルトの名無しさん
垢版 |
2017/05/28(日) 16:10:29.49ID:W53JMrzP
$1 と \1 を間違えて泣きをみて以来、むしろ記憶しないようにしている……・
0124デフォルトの名無しさん
垢版 |
2017/05/29(月) 11:05:33.03ID:sPbSPx8D
コマンドプロンプトのfindstrコマンドで使えるやつより貧弱な正規表現環境なんてないよね?
0128デフォルトの名無しさん
垢版 |
2017/05/30(火) 13:16:32.07ID:V9BCWx6K
>>118
とある地方の区画整理の際、住所表記が変わるので
住所を正規化するために正規表現と簡単なDB処理とを組み合わせた
単純な処理を行うだけの1日仕事で、
そこらのリーマンの3ヶ月分ぐらいお金になった事とかあったな

仕事柄色んな会社を訪問するけど
テキストの簡単な置換すらできない(まずテキスト置換という概念を知らない)人って
事務程度でしかパソコン使わない人にはめちゃくちゃ多いんだよね

そんなに人達に (.+)abcd\n みたいな初歩的な正規表現を教えると
物凄く驚かれる

見下すようだけど世の中そんなもん
0129デフォルトの名無しさん
垢版 |
2017/05/30(火) 17:50:42.66ID:bhgaCfDA
>>128
まぁハードル高いよね、低くないと言うべきか

知らなきゃ「正規表現」というチェックボックスがあっても、それが何をするものなのか
言葉から具体的イメージが全く湧かないし
ヘルプ見てはじめて何をするものなのかわかるという、といっても具体例が
無ければヘルプ見たところで「難しそう>便利そう」になりがち
一目で「難しそう<便利そう」になるならとっくに正規表現を使ってる層だろうし

ファイルの検索 や excel や word や メモ帳 、IE、Edge あたりに正規表現が
最初っからあれば話は違ってくるんだろうなと

Mac触った事ないからアレだけど、Macなら充実してるのかしら?
0130デフォルトの名無しさん
垢版 |
2017/05/30(火) 22:14:32.37ID:wMq9WrJJ
>>129
システム屋やってる人間からしても正規表現って見るからにとっつきにくそうだもんな。
システム会社なのに知らない人間の方が多いというw
0131デフォルトの名無しさん
垢版 |
2017/05/30(火) 22:28:36.41ID:RvF0nsOU
>>130
えー
プログラム組む人種なら例外なく好物だと思ってたんだが(^^;;
0135デフォルトの名無しさん
垢版 |
2017/05/31(水) 08:06:38.95ID:rBoo2fCo
小さな会社だと他より少しPC関連に詳しいってだけでIT部長とか言われこき使われる
勿論そんな役職なんて無い
正規表現なんて言葉を発したらセクハラだの変態だの言われかねん
0136デフォルトの名無しさん
垢版 |
2017/05/31(水) 11:16:23.49ID:u9qpXxTe
>>135
正規表現で置換
とか知らない人が聞いたらアレだもんなw

>>133
正にその世代だけど
昔のperlは正規表現抜きでも変態記法満載だったから
だんだん昔のコードは読めない人が増えてきてる

$line =~ s/(?:\x0D\x0A|[\x0D\x0A])?$/,/;
@values = map {/^"(.*)"$/s ? scalar($_ = $1, s/""/"/g, $_) : $_}
10年ぐらい前のメモからのコピペだけど見ただけで目眩がするw
0137デフォルトの名無しさん
垢版 |
2017/05/31(水) 11:27:09.17ID:u9qpXxTe
>>132
一概にシステムといっても色々あるからね

機器制御系システムなんかだと正規表現を使う機会なんてまず無いだろうし
WEB系の事やってるなら何だかんだで正規表現を使う機会はそこそこあるだろうし
0138デフォルトの名無しさん
垢版 |
2017/05/31(水) 11:46:52.88ID:AV1cHHAT
CSV は、" などのエスケープについて、様々な方言があるから、正規表現では無理。
CSV の方言・規格を確定させてから、Ruby を使うべき

バグのほとんどが設計段階・仕様で生じる。
方言さえ確定していれば、バグらない
0140デフォルトの名無しさん
垢版 |
2017/05/31(水) 12:15:57.63ID:u9qpXxTe
>>138
仕事内容にもよるけどそんな事はない
なんせ世の中にはExcelのデータが糞ほどあるので
「Excelルールのcsvを正規表現で処理する+α」の仕事だけでも
たぶんそこらのリーマンよりは稼がせてもらってきたよ

日本の企業の大半は中小企業なわけだけど
ほんと信じられないほど無駄な事やってる会社がたくさんあるからね
こんな時間に2chなんてやってられるのも、そのお陰ですわ
0142デフォルトの名無しさん
垢版 |
2017/05/31(水) 12:44:32.50ID:gy6WrZsR
>>138
Rubyを使うべき、と言う唐突な結論以外は同意できる。
Ruby (のようなスクリプト)を使うべきなら完全に同意できたのに。
0143デフォルトの名無しさん
垢版 |
2017/05/31(水) 16:04:23.05ID:jFN45aLj
>>142
少し日本語は下手だが、
事前にCSV の方言・規格を確定すべし
という主張と読んだ。
0144デフォルトの名無しさん
垢版 |
2017/05/31(水) 17:04:05.88ID:MQUo5X9j
なぜrubyなのかよく分からん
多少正規表現エンジンの種類やバージョンの違いはあれど
正規表現はperlでもPHPでもJavaScriptでもPythonでも使えるし
rubyの正規表現なんて昔はコールバック処理するのがくそ面倒だった筈だが
0145デフォルトの名無しさん
垢版 |
2017/05/31(水) 17:10:42.06ID:BtqSGsFQ
正規表現を使わずにrubyでやれと言いたいのでは
まあ確かにrubyは標準で簡単強力なcsv処理ができるけど
ruby以外でのcsvの処理の仕方を知らない知識不足な人の戯言にしか見えない
0148デフォルトの名無しさん
垢版 |
2017/06/01(木) 04:08:09.64ID:+TrYOuL5
>>134
VB(今時は.NET)では入力チェックとかでよく使うからお前の偏見だよ。
0149デフォルトの名無しさん
垢版 |
2017/06/01(木) 04:08:53.15ID:+TrYOuL5
>>134
いい忘れたがサクラのマクロもよく使う。
0152デフォルトの名無しさん
垢版 |
2017/06/01(木) 05:39:57.85ID:pPoV2n06
そもそもテキスト処理じゃないと使わんよ
使う使う言う奴はプログラミングの分野が偏ってるんじゃないか?
0153デフォルトの名無しさん
垢版 |
2017/06/01(木) 06:10:29.36ID:htPbJpjE
エンドユーザーに近い分野で使うというより、開発者が使うものでしょ。SQLとかと同じ。
0154デフォルトの名無しさん
垢版 |
2017/06/01(木) 08:16:36.86ID:YbQp1MN1
>>153
そりゃプログラムから使うものだから開発者しか使わんよ
そう言う意味じゃなくて利用者が入力した値の妥当性確認とかに使うケースが多いんじゃね?
って話なんだろ
0161デフォルトの名無しさん
垢版 |
2017/06/01(木) 21:36:20.85ID:z/dTvzRJ
一般に正規表現自体をどこで使うかの話と違うんか?
プログラマがどこで使うかって文脈に限定してるのんか?
0162デフォルトの名無しさん
垢版 |
2017/06/02(金) 00:26:45.39ID:ixZw1vso
perlがそうであったようにログ読んだり整形したりするときにも良く使う。システム管理者。
プログラマによっては無理に正規表現使わないで正規表現を引数に取らないcontainとか複数行で書くって人もいるんじゃないか。入力チェックもそんな考えるような正規表現の出番少ないような。
perlくらい言語に組み込まれてるならともかく。
0164デフォルトの名無しさん
垢版 |
2017/06/02(金) 14:02:59.19ID:s9L+1vWi
正規表現、難しいですね…全然わかりません
お知恵をおかし下さい

例えば

test = "//abc"; // コメント "です"


という一行があった場合、後半の

// コメント "です"

にだけマッチする正規表現はどのように書いたらいいんでしょうか?

最初は

/(?!.*(\"|\'))\/\/(.*)/

こんなカンジで否定的先読みを利用していたのですが、
コメント部にも、 シングル及びダブルクォーテーションが入る可能性が出てきたので、
この書き方では ?! で否定しているためなのかマッチ出来ません。

何か良い書き方はありますでしょうか?
やりたい事は、PHPなどで、javascriptのソースから単一行のコメントを削除したいです。
よろしくお願い致します。
0166デフォルトの名無しさん
垢版 |
2017/06/02(金) 20:31:58.40ID:KFrvDlYH
PHP は知らん

$perl -ne 'm%((?:\".*?\"|/(?!/)|[^/])*)(.*)% ; printf("<$1> <$2>\n");'
test = "//abc"; // コメント "です"
<test = "//abc"; > <// コメント "です">
// コメント "です"
<> <// コメント "です">
$
0167デフォルトの名無しさん
垢版 |
2017/06/02(金) 21:10:46.42ID:yyLeCvfJ
末尾方向から、// を探して、もしあれば、その行を選択する。
^.*\/\/(ここに、2連続以上の、/ が存在しない)$

/// 例えば、3連続でも、コメント扱いするよな?
test = "///abc"; /// コメント "です"

シングルクォーテーションは、どうするんだ?
test = '///abc'; /// コメント "です"
0168デフォルトの名無しさん
垢版 |
2017/06/02(金) 23:18:34.61ID:cODXM6Ca
javascriptだから、シングルダブルは同等機能
"'"とか'"'とか有だし
"\""とかのエスケープもある
"//abc"は文字列だし、"\""//abc"はコメント
0169デフォルトの名無しさん
垢版 |
2017/06/03(土) 00:22:48.22ID:02UJhjHA
みなさん、ありがとう御座います!
165さんの短いのでサクっと出来ました!

なるほど、末尾から検索をかけるとう考えなんですね。

本当に奥が深くて、使いこなすのは難しいです…

いろんなパターンを作りだし、自由にマッチ出来るよう精進します

>165-167さん、ありがとう御座いました!
0171165
垢版 |
2017/06/03(土) 01:16:11.91ID:janVI+9u
>>169
ツッコミか逆ギレ待ちだったんだが…
165ではコメントが無くてコード中に//がある場合にそのコードの部分にマッチする
削除だとコードを削ってしまうよ
コード中に//が無い場合、またはコード中に//がある場合にその後ろにコメント行がある場合、限定
マトモなのは「JS コメント 正規表現」とかのワードでggr
0173デフォルトの名無しさん
垢版 |
2017/06/03(土) 02:57:17.44ID:02UJhjHA
>>171
え!?
限定的なテストで、思ったとおりの動きをしたので、おお!すげー!って思ってました…

実際のスクリプトには、まだ組み込んでないので気付きませんでした

他の方が書かれてた方法も試したり、ググってみますね
0174デフォルトの名無しさん
垢版 |
2017/06/03(土) 04:51:38.86ID:ZUxfcpWv
区切り記号 ; や閉じ括弧 } のあとにスペースかタブいくつかの後に来る // から行末をコメントと見なすのが簡単?
0175デフォルトの名無しさん
垢版 |
2017/06/03(土) 12:52:21.44ID:7vig672V
コメント化は、プログラムデバッグ中にも命令を無効にするために使うこともあるし、ことはそう簡単じゃないよ
//if(hoge=="http://hoge.net";) {//コメント
0176デフォルトの名無しさん
垢版 |
2017/06/03(土) 14:13:52.35ID:ep62Y9tf
これは、無限の組み合わせがあるから、正規表現じゃ無理

AST変換とか、LLVMでコンパイル後の命令木をもらって、
コメント部分を削除するとかしないと、自力じゃ無理なレベル
0181デフォルトの名無しさん
垢版 |
2017/06/03(土) 16:32:48.16ID:7vig672V
何それ限定なの?
06\/03\(
(スラッシュにエスケープが要らない場合もあるけど付けといてダメなことはない)
0183デフォルトの名無しさん
垢版 |
2017/06/03(土) 22:49:00.44ID:yEDWU2+/
正規表現って本当に色々なパターンでテストしないと抜けがあったりするから怖いね
0184デフォルトの名無しさん
垢版 |
2017/06/03(土) 23:15:22.50ID:eiMrU4PF
>>183
それは仕様を理解していないから。
正規表現で表現してあるパターン以外にマッチする事はないんだから、
抜けがあるならパターンの意味を理解していないって事
0187デフォルトの名無しさん
垢版 |
2017/06/05(月) 17:11:30.09ID:oWlVC1QB
非欲張り、欲張り、強欲の違いが分からなかったんだけど
ttp://d.hatena.ne.jp/atzy/20110309/p1
これ読んでやっと分かった
こりゃエディタの検索で試してるだけじゃ理解出来なくて当然だね

誰か同じように例を交えて先読みと戻り読みのロジックを解説して欲しい
それか解説してるwebページがあるならリンク貼って下さい
0188デフォルトの名無しさん
垢版 |
2017/06/09(金) 23:50:59.51ID:fJoQB/gQ
●Regular Expressionの使用環境
秀丸 HMJRE.DLL V5.00
●検索か置換か?
置換
●説明
文章最後の文字からEOFまでの 空白(全角半角両方) タブ 改行 を消したい。
●対象データ
AAAAA

BBBBB

CCCCC
 

[EOF]

●希望する結果
AAAAA

BBBBB

CCCCC[EOF]
0191デフォルトの名無しさん
垢版 |
2017/06/12(月) 04:37:37.47ID:40WtKqR9
>>187
Qiitaなのでコメントまで必ず読むこと

正規表現の先読み/後読みを「絞り込み」と理解してみる - Qiita
http://qiita.com/blackenedgold/items/382704cc54c8e42819d0

[コラム] 正規表現の先読み/後読みは、どう考えても名前が悪いので、呼称禁止令を出してルックと気軽に呼んでみませんか。 - Qiita
http://qiita.com/mochizukikotaro/items/84f3ab2740b8efbe0dc6

後者は日本語表現のネタモノなので理解にはあまり役に立ちませんが
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況