Regular Expression(正規表現) Part15

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2019/09/16(月) 22:25:11.87ID:enU8we0d
Regular Expressionスレです。

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

前スレ
Regular Expression(正規表現) Part14
https://mevius.5ch.net/test/read.cgi/tech/1489511075/


次スレは>>980宜しく
天ぷら等>>2以降
2019/09/16(月) 22:25:47.75ID:enU8we0d
スルーされにくい質問のテンプレと例

●Regular Expressionの使用環境
Java1.5

●検索か置換か?
検索

●説明
各行の1番目のAまでを検索したい

●対象データ
ABCA
BCAA
CABA

●希望する結果
ABCA
^
BCAA
^^^
CABA
^^

※ ^ はアンダーラインだそうな ^^;
2019/09/16(月) 22:45:50.99ID:UVYTIEdn
◆関連サイト
正規表現メモ
http://www.kt.rim.or.jp/~kbk/regex/regex.html
Perl正規表現雑技
http://www.din.or.jp/~ohzaki/regex.htm

詳説 正規表現
http://www.oreilly.co.jp/books/9784873113593/
正規表現クックブック
http://www.oreilly.co.jp/books/9784873114507/

正規表現プログラミングFAQ
http://capslockabcjp.kitunebi.com/faq.html

.NET Framework の正規表現 | Microsoft Docs
https://docs.microsoft.com/ja-jp/dotnet/standard/base-types/regular-expressions
正規表現 - JavaScript | MDN
https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Regular_Expressions

鬼車
http://www.geocities.jp/kosako3/oniguruma/index_ja.html
鬼雲
https://github.com/k-takata/Onigmo
Boost.Regex 1.45.0 (日本語訳)
http://alpha.sourceforge.jp/devel/boost.regex_ja_1_45_0.pdf

秀丸: 複数行にまたがる検索について
http://homepage2.nifty.com/jr-kun/hidemaru_qa/4_regulr.html#RETURNS

サクラエディタ: 改行
http://d.hatena.ne.jp/myokoym/20101219/1292779058
※ サクラエディタでは複数行に渡る検索・置換は出来ません。
2019/09/17(火) 01:53:27.68ID:JrU+31ml
正規表現技術入門
https://gihyo.jp/book/2015/978-4-7741-7270-5

↑の著者の一人であり Onigmo の作者でもあるtakata先生のツイ
https://twitter.com/k_takata
https://twitter.com/5chan_nel (5ch newer account)
2019/09/17(火) 07:00:40.77ID:Au9Vzrnr
>>1-2
2019/09/21(土) 18:08:57.67ID:oqO8j0PL
●Regular Expressionの使用環境 
サクラエディタ bregoning.dll ver 3.06という記載があります

●検索か置換か? 
置換

●説明 
うしろに数字を付けたい。


というのを
/(^.*)/$1/ で置き換えると

になります(変わらない)。
これを、あ→あ00にするために
/(^.*)/$100/ とはできません。

$1等の直後に、数字を付け足すためにはどのように
表現したらよいか教えてください。

元の行の末尾に付け足すとは限らないので、
$1(実際はもっと多いのですが・・)の直後に数字を付け足す方法をお教えください。
2019/09/21(土) 19:27:26.83ID:3YukOVDp
>>6
/(^.*)/${1}00/
https://sakura-editor.github.io/help/HLP000089.html
2019/09/21(土) 20:16:26.14ID:oqO8j0PL
>>7
ありがとうございます。
ヘルプを見るという基本がなってませんでした
もうしわけありません。
9デフォルトの名無しさん
垢版 |
2019/10/03(木) 17:59:43.15ID:WLIOnQPh
正規表現クロスワードパズル。めっちゃおもろいww
https://regexcrossword.com/
2019/10/03(木) 22:01:07.23ID:ArP3YJIm
解き方がわかんねぇ・・・

https://regexcrossword.com/challenges/beginner/puzzles/1

[^SPEAK]+
HE|LL|O+

が交わるマスがなんで、Hになるんだ
2019/10/03(木) 22:18:27.45ID:gZNTfFgd
クロスワードの基本ルールと同様に各マス1文字だが、通常と異なり各ラインが単語になるとは限らない
縦のラインを横ラインをそれぞれ検索対象のテキストと見做して両方がマッチすればOK
ちなみに1回で1ライン全てにマッチする必要は無くて複数回検索して全マスにマッチする形でも良いみたい
2019/10/03(木) 22:25:40.75ID:TCa0Rrk0
>>10
まず
EP|IP|EF
の列を埋めてみよう。
2019/10/03(木) 22:54:32.85ID:ArP3YJIm
>>11
>>12

ありがと。わかったわ。

>縦のラインを横ラインをそれぞれ検索対象のテキストと見做して両方がマッチすればOK

クロスワードって考え方がスポーンと抜けてた。
枠外にある正規表現を、「縦のヒント」「横のヒント」としてみなすわけね。

for i in A B C D E F G H I J K L M N O P Q R S T U V W X Y Z;
do echo $i | egrep "縦条件" | egrep "横条件" #縦横逆も可
done;

的な考え方をしてたわ・・・
2019/10/04(金) 23:39:05.24ID:FCfJ1C/v
全制覇した。疲れた。本来はもっとのんびり楽しむものだよな。
15デフォルトの名無しさん
垢版 |
2019/10/05(土) 09:26:56.80ID:oVPf95FK
すげえ!高難易度のやつ歯が立たないわ
2019/10/05(土) 16:01:21.83ID:8eaxbCO5
https://regexcrossword.com/playerpuzzles/59e565c95008d

これとか解けるのは人間ではないと思うわ
2019/10/05(土) 16:35:39.41ID:+ss/CUcr
アカウント持ってないから login はできないけど
自分が解いた結果はまだ見られるな。
クッキーを削除したら見られなくなるんだろうか。
18デフォルトの名無しさん
垢版 |
2019/10/05(土) 16:44:21.25ID:0WeqN8Y0
>>16
なんじゃこりゃwww
本末転倒だけどこれ数独ソルバーみたいにコンピューターに解かせられんの?
2019/10/05(土) 23:37:56.24ID:rOar3xCR
テキストエディタで試したら全27ラインマッチする状態になってるのに正解にならんなあ
2019/10/06(日) 00:08:45.90ID:IBgflZCa
どうもブラウザのせいだったようで、同じ内容を普段使ってないChromeで試したら正解扱いになった、よかった

作った人は凄いけど、解くのは1個1個できるところから埋め、条件を少しずつ絞りこんで行けば案外見た目ほど難しくはない
正規表現の可変長の書式の影響でクロスワードよりピクロスを解く感覚に似てる気がするのでその辺やってた人はちょっと有利かも
あと記憶力に余程の自身がなければ、ちょっと大きめに印刷して各マスに細かい条件を書きながらやったら大分楽になると思う
2019/10/06(日) 12:02:16.89ID:ONMi4OJn
●Regular Expressionの使用環境
※テキスト(csv)を成型するという目的なので、なんでもいいです。
 フリー(ネットからDL可能)なものであれば環境を作ります。

●検索か置換か?
置換

●説明
csvファイルの第4フィールドに説明文的なものが入ってます。
ここに半角カンマが紛れています。これを全角文字(、)に置き換えたい。
第4フィールドにいくつカンマがあるかは不定です。(0の場合もあれば、2個、3個、場合によっては10個、それ以上など)
第4フィールド以外は種類は多いのですが特定の文字が入ります。また第4フィールド以外はカンマは入っていません。
各行のフィールド数は固定です。(実際は20フィールドあるのですが、省略のため5フィールドにしてます)

●対象データ
Field1,Field2,Field3,ここは説明文,Field5
Field1,Field2,Field3,説明文です,Field5
Field1,Field2,Field3,ここは説明文,ですよ,Field5
Field1,Field2,Field3,説明してる,フィールドですよ,Field5

●希望する結果
Field1,Field2,Field3,ここは説明文,Field5
Field1,Field2,Field3,説明文です,Field5
Field1,Field2,Field3,ここは説明文、ですよ,Field5
Field1,Field2,Field3,説明してる、フィールドですよ,Field5

よろしくお願いいたします。
2019/10/06(日) 13:19:25.82ID:MVlRtd/O
3つ目の,以降から,field5までの間をキャプチャで良さそう。
23デフォルトの名無しさん
垢版 |
2019/10/06(日) 21:18:49.15ID:QazjZrDG
>>21
perl -ne '($a,$b,$c)=m/^((?:[^,]+,){3})(.*[^,])((?:,[^,\n]+){1})$/; $b=~s/,/、/g; print "$a$b$c\n"' input.csv

先頭の三つはカンマの数を数えて取り出し
^((?:[^,]+,){3})
フィールド数は固定とのことなので末尾側もカンマの数で取り出せる
((?:,[^,\n]+){1})$
その間が置換対象
(.*[^,])

ということで数字(3 と 1)を調整すれば実際のデータにも適用できると思います
24デフォルトの名無しさん
垢版 |
2019/10/06(日) 21:30:20.48ID:QazjZrDG
>>23
Python版
https://ideone.com/ApnsLv
2019/10/07(月) 01:52:14.06ID:iyJYb3kL
質問を読んで直ぐにこれを書けるのなら速いけど
もし自分だったらあれをこうしてこれをこうしてと考えて試してる
間にテキストエディタとエクセルを行ったり来たりしながら
タブの挿入と置換と削除を繰り返した方が速いところが
悩ましいw
2019/10/07(月) 03:37:15.45ID:21LgfgEW
Ruby で、下のコードを、script.rb に書いて、
入力ファイル名を、input.csv とすると、

端末で、ruby script.rb input.csv と入力する。
つまり、ruby スクリプトファイル名 入力ファイル名

require 'csv'

# 引数はファイル名
CSV.filter( File.open( ARGV[ 0 ] ) ) do |row| # 1行ずつ処理する
row[ 3 ] = row[ 3 ].tr( ",", "、" ) # 列4
end
2726
垢版 |
2019/10/07(月) 04:17:44.92ID:21LgfgEW
>>26
修正

tr ではなく、tr! で、直接レシーバー(文字列)を変更できる

>row[ 3 ] = row[ 3 ].tr( ",", "、" ) # 列4
row[ 3 ].tr!( ",", "、" ) # 列4
2019/10/07(月) 08:59:18.56ID:fodStNL1
それ splice でできるんじゃね? と思ったのでやってみた。

perl -nF, -e 'splice( @F,3,0,join("、",splice( @F,3,@F-5+1))); print( join(",",@F));'
29
垢版 |
2019/10/07(月) 21:08:31.31ID:cbxlkLVD
>>26
カンマでカラム分割してるからrow[3]にはカンマが含まれないよ

ARGF.each do |line|
line.match(/((?:.+?,){3})(.+)((?:,.+){1})/) do |match|
puts match[1] + match[2].gsub(",", "、") + match[3]
end
end

こういうのって力技で変換するよりも
CSV生成側でクウォートし直したほうがいいよね
2019/10/07(月) 22:07:48.83ID:fodStNL1
手間をかけたくないなら、そんなフィールドは末尾に置くのが良い。
そうしておけば何を書こうと邪魔にならない。
いつかは手作業の限界を感じるかもしれないが、それを遅らせることはできる。
31デフォルトの名無しさん
垢版 |
2019/10/07(月) 23:06:48.69ID:gEYFs1Cq
AIDS治療みたいなもんか
3226
垢版 |
2019/10/07(月) 23:29:10.22ID:21LgfgEW
>>29
>>26 は、CSV モジュールを使っているから、
列をクォートする事で、列内に、カンマが存在できる!

入力ファイル
a,b,c,"あ,い,う",d

require 'csv'

# 引数は入力ファイル名
CSV.filter( File.open( ARGV[ 0 ] ) ) do |row| # 1行ずつ処理する
p row[ 3 ] #=> "あ,い,う"
row[ 3 ].tr!( ",", "、" ) # 列4
end

出力
a,b,c,あ、い、う,d
2019/10/07(月) 23:56:45.43ID:cbxlkLVD
>>32
いやそりゃクウォートしてれば問題ないよ

a,b,c,あ,い,う,d

a,b,c,"あ,い,う",d

変換する処理が必要なわけで
そこができてないから困ってるんじゃないのかな
3426
垢版 |
2019/10/08(火) 00:22:31.74ID:cRqslSem
クォートしてなかったら、そもそも、CSV にならない!

列内に、カンマが含められないから、列数も変動する
2019/10/08(火) 00:32:16.98ID:brYPe3Nc
それがわかってるから変形したいんじゃん。
3626
垢版 |
2019/10/08(火) 02:16:13.41ID:cRqslSem
バグのほとんどが設計段階で生じる、典型的な例かw

バグを設計段階で修正せず、実装段階で修正しようとするから、
ますますダメになるという例w

SE・上流工程が馬鹿だと、こういうのが多いw
Ruby などで実装した事がないからだろうw

ダメな事をやる香具師が、あまりにも多いw
2019/10/08(火) 06:58:17.53ID:nEU/9wkt
なにこの人
要望・仕様を満たせないバグありのプログラムを書いておいて
それを指摘されたら「設計が悪い」と逆ギレしだしたよ
Ruby使う人ってこんなしょうもないおっさんに成り下がるのか
38デフォルトの名無しさん
垢版 |
2019/10/08(火) 07:25:01.06ID:daf3ib6k
>>21
Vim
:%s/^\%([^,]*,\)\{3\}\zs\(.*\)\%(\%(,[^,\n]*\)\{1\}$\)\@=/\=substitute(submatch(0), ',', '、', 'g')/

Emacs
M-x query-replace-regexp
正規表現:
^\(\(?:[^,]*,\)\{3\}\)\(.*\)\(\(?:,[^,
]*\)\{1\}\)$
置換:
\1\,(replace-regexp-in-string "," "、" \2)\3

正規表現は>>23とほぼ同じだけど、空のフィールドに対応するよう + をすべて * に変更した
「第4フィールド」の内容がカンマだけの場合にも対応 (.*[^,]) → (.*)
39デフォルトの名無しさん
垢版 |
2019/10/12(土) 19:38:36.96ID:vBnCHMzu
>>16
お題スレの人が総当たりソルバー作ってくれた
https://mevius.5ch.net/test/read.cgi/tech/1564310397/757
2019/10/29(火) 11:16:30.73ID:czk9+d/A
●Regular Expressionの使用環境
サクラエディタ bregoning.dll ver 4.12

●検索か置換か?
置換

●説明
をふくむ行(複数)を削除

●対象データ
A.jpg
B.jpg
C.jpg

●希望する結果
A.jpg

Bだけを削除するなら^.*B.*\nってわかるんですけど
B、Cを削除する方法がわかりません
誰か教えてください よろしくお願いします
2019/10/29(火) 11:28:33.00ID:Ef61zXRp
>>40
いまいちやりたいことがはっきりしないが、
Aのみ残したなら、^[^AA].*?jpg¥n
BCのみ消したいなら、^[BC].*?jpg¥n

Aのみ全角なのは故意なのか?
2019/10/30(水) 12:29:04.54ID:n2bLSC2q
を含む行を削除
でググればすぐに見付かるんだが

ttps://yanohirota.com/regex-delete-row/
キーワードを含む行(複数指定) ^.*(キーワード1|キーワード2).*$(\r\n|\r|\n)?
43デフォルトの名無しさん
垢版 |
2019/10/31(木) 18:25:55.12ID:KC+T8umE
●Regular Expressionの使用環境
Mery
●検索か置換か?
置換
●説明
パターンにマッチする行までの全ての行をキャプチャしたい
●対象データ
20191001
吾輩は猫である
名前はまだ無い
……
20191002
親譲りの無鉄砲で
子供の頃から
損ばかりしている
……

●希望する結果
20191001[Tab]"吾輩は猫である
名前はまだ無い
……"
[改行]
20191002[Tab]"親譲りの無鉄砲で
子供の頃から
損ばかりしている
……"
日付と本文が交互に現れるテキストを日付と本文とに分けてキャプチャして置換したいのですが、上手く行きません。
最短一致を使用すると本文が一行しかキャプチャできないし、最長一致ですと最後の日付までの全行がキャプチャされてしまいます。
どうかご教示下さい。
2019/10/31(木) 20:12:39.29ID:qSOPmN+b
>43

検索
(^[0-9]{8})\n

置換
\n$1\t
2019/11/01(金) 00:19:13.27ID:l+SDkm5c
Ruby では、

text = <<"EOT"
20191001

20191002


EOT

# キャプチャー部分の、#{ $1 } は、8桁の数字
p res = text.gsub( /^(\d{8})\n/ ) { "\n#{ $1 }\t" }
print res

出力
[空行]
20191001[Tab]あ
[空行]
20191002[Tab]い
46デフォルトの名無しさん
垢版 |
2019/11/01(金) 08:08:52.32ID:TORoDjzQ
>>44
ご回答ありがとうございます。
すみません。本文部分を"で括りたくて、数字8桁に挟まれた部分にマッチさせたいのです。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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