1 名前:デフォルトの名無しさん [2017/03/15(水) 02:04:35.47 ID:e01p03UP.net] Regular Expressionスレです。 質問する場合は必ず実装言語や処理系ソフトウェア名を示してください。 前スレ Regular Expression(正規表現) Part13 echo.2ch.net/test/read.cgi/tech/1415149975/ 次スレは>>980 宜しく 天ぷら等2以降
421 名前:409 mailto:sage [2018/01/16(火) 19:25:09.57 ID:1yOH1J8J.net] 正規表現でも、できた。 Ruby では、先頭から、% 以外の文字を探す pattern = /^[^%]+/ str = '/dir/desktop.inib%01%EE%81' puts pattern.match str 結果 /dir/desktop.inib
422 名前:デフォルトの名無しさん mailto:sage [2018/01/16(火) 20:18:43.79 ID:y9BMfGeo.net] 要件には書いてないけど, .iniまでが正しいファイル名だと思うよ その後ろのbとかeもゴミ
423 名前:デフォルトの名無しさん mailto:sage [2018/01/16(火) 22:39:12.31 ID:9E60uHWe.net] どういう法則性でb,eが付いたのかがわからないと、 b,eの他にも付くのがあるのか、また付かないこともあるのかもわからん 例えば、hoge.exee%01とかになるのか?
424 名前:403 mailto:sage [2018/01/17(水) 15:18:31.78 ID:BVJUZk9+.net] 皆さんありがとうございます。 >>413 それ以外にも幾つか変な文字の時もあり、 問題なく何も付かない時もあります。 決まったパターンは無いと思った方が良いですね。 すべてが1byte文字の時は
425 名前:413 mailto:sage [2018/01/17(水) 17:17:53.77 ID:BVJUZk9+.net] 最後に変な文章を残してしまいました。 すべてが1byte文字を要求するときは、 そんな変なゴミは付きにくいと書こうと思ったのですが、 まだ確証が無いので無視して結構です。
426 名前:デフォルトの名無しさん mailto:sage [2018/02/07(水) 23:42:01.50 ID:3vNjEx0B.net] ●Regular Expressionの使用環境 桜エディタ(テキストエディタ) ●検索か置換か? 置き換え ●説明 文字数、文字種はいろいろです。ただしすべて半角(1バイト文字)です。 結果として、<>内の文字だけにできればどんな方法でも構いません 必要な情報かわかりませんが、<>の外には、<>があることはありません。 asqa>w3e<a>s98<as897kja> ←こんな感じの行はありません。 行末は必ず、>で終わり、必要な文字は必ず<>でくくられたものの中にあります。 いらない文字<必要な文字>ここに改行が入る という書式は絶対です。 ●対象データ R&^&*(!TYUIKM<slihfd> BA%(*&%ASAS<asdlikh> TF^(VB(*&N<a09sfyighkljn> ●希望する結果 slihfd asdlikh a09sfyighkljn よろしくお願いいたします。
427 名前:デフォルトの名無しさん mailto:sage [2018/02/08(木) 00:23:12.83 ID:kN+YdVUy.net] ^[^<>]*<([^<>]+)>$ $1
428 名前:デフォルトの名無しさん mailto:sage [2018/02/08(木) 23:06:15.86 ID:VxK8nSc/.net] [^<>^] サンクス
429 名前:デフォルトの名無しさん mailto:sage [2018/02/08(木) 23:24:13.78 ID:Zisu4Ynz.net] >>417 ありがとうございます。うまく抽出できました。
430 名前:デフォルトの名無しさん mailto:sage [2018/02/08(木) 23:37:41.58 ID:kN+YdVUy.net] このぐらいの正規表現なら基本だし, 覚えると正規表現の載ってるエディタでの編集が楽になるよ とりあえずPerl互換を勉強してみるといい
431 名前:デフォルトの名無しさん mailto:sage [2018/02/14(水) 13:35:37.03 ID:2LP2x+pK.net] C#なんですが [ああ]おおおおお [いいい]こここここ [うう][ええ]そそそそそ ととととと[たた] ↓ おおおおお こここここ そそそそそ ととととと[たた] にしたいんですが、どうしたらいいでしょうか。 ※先頭じゃない文中の[はは]は残したい
432 名前:デフォルトの名無しさん [2018/02/14(水) 17:41:06.84 ID:ZzaOqvDP0] ^\[.*\]
433 名前:デフォルトの名無しさん mailto:sage [2018/02/16(金) 13:56:45.89 ID:uX7uVTrc.net] \[[^\]]*?\](?!$) ところによっては\[[^\]]*?\](?!(?:\n|$))
434 名前:デフォルトの名無しさん mailto:sage [2018/02/16(金) 14:10:38.80 ID:ga78Zu+3.net] マルチラインモード ^(?:\[([^\[\]])\1*\])+ マッチ部分を除去
435 名前:420 mailto:sage [2018/02/16(金) 14:11:39.72 ID:CWd36B/o.net] 1行目でバッチリ 感動しました!!!
436 名前:デフォルトの名無しさん mailto:sage [2018/02/16(金) 14:15:41.25 ID:CPKH/1dQ.net] それ文末以外消えるけどええのん
437 名前:421 mailto:sage [2018/02/16(金) 15:30:22.93 ID:mPXTHkFg.net] >>426 文中は消えていいんじゃない? >>421 に > [うう][ええ]そそそそそ > そそそそそ ってあるし あ、 > ※先頭じゃない文中の[はは]は残したい この[はは]はマッチしたらダメなのか これ例の中においてくんないかなー というか定義がよくわからんちん ^\[.*\](?!$) ところによっては(?<=(?:^|\n))\[.*\](?!(?:\n|$)) マッチ [ああ]おおおおお [いいい]こここここ [うう][ええ]そそそそそ [たた]ななはは[まま]やや →[たた]ななはは[まま] [たた]ななははまま[やや] →[たた] アンマッチ ととととと[たた] ちち[はは]ぱぱまま
438 名前:421 mailto:sage [2018/02/16(金) 15:30:54.45 ID:mPXTHkFg.net] >>427 [たた]ななはは[まま]やや の[まま]を含めずマッチしたい([たた])ならかなり複雑になりそうでちょっといますぐは思いつかないや それってつまり 行頭[ 行頭から括弧が繋がり、且つ、行末]を含めない範囲 なら
439 名前: [たた][なな][はは][まま][やや] のマッチが →[たた][なな][はは][まま] でいいのか、それとも行そのものがアンマッチなのかよーわからんし [] [ここ壊れてます]
440 名前:デフォルトの名無しさん mailto:sage [2018/02/16(金) 15:55:42.80 ID:CPKH/1dQ.net] >>427 カッコ内も同じ文字が重なるように読めるしなー まぁこういう仕様をちゃんと書けるならそもそも正規表現で困らんのだろうけど
441 名前:デフォルトの名無しさん mailto:sage [2018/02/16(金) 15:57:06.09 ID:CWd36B/o.net] orz... 試したら確かに >>424 だと先頭が残りますネ
442 名前:デフォルトの名無しさん mailto:sage [2018/02/16(金) 16:00:32.77 ID:CWd36B/o.net] すみません [ああ]おおおおお → おおおおお [あああ]おおおおお → おおおおお [ああ][いい]おおおおお → おおおおお あああああ[いい] → あああああ[いい] あああ[いい]うう → あああ[いい]うう です。 先頭付近の [] は消したいけど、それ以外は残したい、って風です。
443 名前:421 mailto:sage [2018/02/16(金) 16:24:42.64 ID:rLsYeXBU.net] >>431 [たた]ななはは[まま]やや は? [たた][なな][はは][まま][やや] はどーなんの? [あいう[かきく]たちつ] [あいう[かきく]]たちつ とか括弧内包の場合どーなんのとかも あと行末も係わるんだから、例の同じ行に余計な文字列入れないで(たぶんこの件では大過ないと思うけど)
444 名前:421 mailto:sage [2018/02/16(金) 16:25:23.31 ID:rLsYeXBU.net] >>432 内包無視するとしたら (?<=^)(?:\[[^\[]*?\])+(?!$) ところによって(?<=(?:^|\n))(?:\[[^\[]*?\])+(?!(?:\n|$)) かね >>431 を満たし、 [たた]ななはは[まま]やや →[たた] [たた][なな][はは][まま][やや] →[たた][なな][はは][まま] となるし たぶん 行頭[ および 行頭[に対応する]までマッチ 行頭[ および 行頭[に対応する]から括弧が繋がり、且つ、行末] および 行末]に対応する[までを含めない範囲 あたりなんだろうなー ぱっと思いつくのはちょめちょめしたダウンロードファイルのリネームをしたいようなかんじかね
445 名前:デフォルトの名無しさん mailto:sage [2018/02/16(金) 16:26:09.97 ID:dBpGhFbZ.net] 仕様に不備があると作る方は大変だな
446 名前:デフォルトの名無しさん mailto:sage [2018/02/16(金) 17:00:58.65 ID:Q4bZpk0j.net] 正規表現の使いどころってどんなところですかね? 普通レベルのプログラマから見ると可読性低くて保守性も悪い気がする タグの要素を最初にバッと配列に入れやすいとか?
447 名前:デフォルトの名無しさん mailto:sage [2018/02/16(金) 17:11:19.84 ID:GgVv8IsN.net] >>435 可読性低くて保守性も悪いっていうのは本当にその通り プログラミングで使うならまずは(正規表現が非常に直感的でない限りは)正規表現以外の選択肢を考えるべきで, それが可読性や保守性を上げないとなった上で正規表現が選択されるのがよい 勿論保守性や可読性を気にしないワンライナーとかであれば気にする必要はないが あとはエディタやgrepなんかだと他に有力な選択肢がないから正規表現になる
448 名前:デフォルトの名無しさん mailto:sage [2018/02/16(金) 17:18:48.02 ID:h4N2NTdR.net] 単純に、 (?m)^\[.*\](.*) じゃだめなん?
449 名前:デフォルトの名無しさん mailto:sage [2018/02/16(金) 17:23:34.33 ID:GgVv8IsN.net] >>437 全然ダメ 入力が [abc]def[ghi] なら全文がマッチする(量化指定子*はgreedyだから末尾手前まで全部食う)
450 名前:デフォルトの名無しさん mailto:sage [2018/02/16(金) 17:34:31.04 ID:dBpGhFbZ.net] >>435 実行環境によってだけどコンパイルされて速くなったりするので さくっと一行で書けるならメリットはあるよ プログラム書いた方が良い場合もある ケースバイケース
451 名前:デフォルトの名無しさん mailto:sage [2018/02/16(金) 18:30:54.06 ID:Q4bZpk0j.net] >>436 >>439 レスサンクスコ 今Pythonで作られているパッケージを保守してるんだけど、お約束のように最初に正規表現で抜いて後で編集してる 最初のパフォーマンスを考慮してるのかもだけど、読みにくくて一般人にはいいことないよ
452 名前:デフォルトの名無しさん mailto:sage [2018/02/16(金) 19:13:24.69 ID:M8XJLm2H.net] >>435 ワンライナーで可読性保守性とか気にしない ストリームエディタで検索、ログの抽出が最たる用途じゃないか
453 名前:デフォルトの名無しさん [2018/02/16(金) 20:46:56.42 ID:d9VDf+sb.net] >>421 $# 「行頭部分にある 1 個以上の \[[^\]
454 名前:*\] を削除」と初見で思ったのだが、違うのか? $# それとも C# でどうやるかわからないという話? 申し訳ないが C# は知らない。 $ $cat a_in [ああ]おおおおお [いいい]こここここ [うう][ええ]そそそそそ ととととと[たた] [ええ]あああ[いい]うう $perl -pe 's/^(\[[^\]]*\])+//' < a_in おおおおお こここここ そそそそそ ととととと[たた] あああ[いい]うう $perl -0777 -pe 's/^(\[[^\]]*\])+//gm' < a_in おおおおお こここここ そそそそそ ととととと[たた] あああ[いい]うう $ [] [ここ壊れてます]
455 名前:デフォルトの名無しさん mailto:sage [2018/02/16(金) 21:24:08.90 ID:nYHQACKk.net] >>438 Non-greedy(最短)なマッチ使えばいいだけじゃね? 使えない環境なの?
456 名前:デフォルトの名無しさん [2018/02/17(土) 05:30:35.08 ID:xZfN9pA3.net] 何を望んでいるのかを明確にする方が先かと……
457 名前:デフォルトの名無しさん mailto:sage [2018/02/17(土) 11:13:15.50 ID:sN1lrGX4.net] >>443 none-greedyじゃ先頭しかマッチしない [abc][def]ghi の[abc]しか除去出来ない 反復適用すればいいというならその通りではあるが
458 名前:デフォルトの名無しさん mailto:sage [2018/02/17(土) 11:27:08.57 ID:IU1gsQgu.net] [ab][cd][ef]ああ これは、繰り返しが入っている。 N回削除する必要がある [ab][cd][ef]ああ [cd][ef]ああ [ef]ああ ああ [〜] でグループ化すべき
459 名前:デフォルトの名無しさん mailto:sage [2018/02/17(土) 12:22:01.47 ID:IU1gsQgu.net] /^\[[^\]]*\]/ =~ "[ab][cd]ああ" $& #=> [ab] Ruby で書いた。 行頭が\[ で、\[ 以外の文字が、0以上続いて、\] がある
460 名前:デフォルトの名無しさん mailto:sage [2018/02/17(土) 12:32:03.69 ID:IU1gsQgu.net] /^\[[^\]]*\]/ =~ "[ab][cd]ああ" $& #=> [ab] $' #=> [cd]ああ /^\[[^\]]*\]/ =~ $' $& #=> [cd] $' #=> ああ /^\[[^\]]*\]/ =~ $' #=> nil Ruby で書いた。 行頭が\[ で、\[ 以外の文字が、0以上続いて、\] がある $& はマッチした部分で、$' はマッチした部分の後ろを表すから、 マッチを繰り返していけば、出来るけど
461 名前:デフォルトの名無しさん mailto:sage [2018/02/17(土) 12:42:57.33 ID:IU1gsQgu.net] /^(\[[^\]]*\])+/ =~ "[ab][cd]ああ[ef]" $& #=> [ab][cd] やったー。Ruby で出来た \[ があり、\[ 以外の文字が、0以上続いて、\] がある。 これをグループ化して、1回以上繰り返す ただし、グループ外に、先頭からを指定する
462 名前:デフォルトの名無しさん mailto:sage [2018/02/18(日) 07:04:41.40 ID:4dAbe4pu.net] 正規表現で使用される記号があるとワケわからなくなってくるから 適当な記号、例えばQなどに置き換えて試行錯誤して最後に元の記号に戻したりする
463 名前:デフォルトの名無しさん [2018/02/18(日) 11:53:19.92 ID:QWcmX5lk.net] 余計なバックトラックを防ぐために $s = qr/(?>\s*)/ ってやってパターンに埋め込むことならある。
464 名前:デフォルトの名無しさん mailto:sage [2018/02/23(金) 22:29:48.73 ID:vtIXFjR6.net] (?s:^(?=.*ス)(?=.*プ)) CHmateで使う正規表現らしいんだけど最初の (?s:" の意味が検索してもわからないのですが教えていただけないでしょうか
465 名前:デフォルトの名無しさん mailto:sage [2018/02/23(金) 22:45:42.10 ID:0zsudQHR.net] >>452 シングルラインモード >>349
466 名前:デフォルトの名無しさん mailto:sage [2018/02/24(土) 00:35:55.07 ID:bvxyjlLF.net] >>453 ありがとございます 確認してなんとなく分かりました ところでこの正規表現の場合(?s:)って名前には改行はないので不要じゃないかと思ってしまうのですがどういう目的で使われているのでしょうか
467 名前:デフォルトの名無しさん mailto:sage [2018/02/24(土) 01:37:05.64 ID:d6NztqhC.net] 書いたヤツの趣味じゃ? しかもかなりてきとう ワッチョイ名前ならおそらくドコモ判別?でもプだけではないitest.5ch.net/test/read.cgi/mango/1467623805/312 先読みなんてコストかけなくてもKOROKORO AAはSd固定 改行を無理矢理入れ込んでというシチュエーションでスとプでねらい打ちも違和感 本文で^(?=.*A)の類を使うとレス数後半のコストはかなりのもの これは名前だから大したことにはならないけど 深謀遠慮があるのかも知れんがそれこそ書いた本人へ
468 名前:デフォルトの名無しさん [2018/02/27(火) 15:54:44.12 ID:2v1tH105.net] C#で、 var rgx = new Regex("(.)+"); var str = "こんにちは。"; Console.WriteLine(rgx.Replace(str, "$1")); とすると「。」が出力されるのですが、なぜですか? $1は「。」になるのですか?「こ」だと思ったのですが、違いますか?
469 名前:デフォルトの名無しさん mailto:sage [2018/02/27(火) 16:08:59.77 ID:u9k8VAiO.net] >>456 理由はここ読んで https://www.regular-expressions.info/captureall.html 短い説明は↓ここでも出てくる https://regex101.com/r/te5DBr/1
470 名前:デフォルトの名無しさん mailto:sage [2018/02/27(火) 17:03:18.46 ID:VEiALCIH.net] どれどれ… javascript 'こんにちは。'.replace(/(.)+/, '$1'); => "。" ほんまや!知らんかった
471 名前:デフォルトの名無しさん mailto:sage [2018/02/27(火) 19:34:07.35 ID:LuvO3mbW.net] >>457 配列に入れてくれればいいのに って思ったことあるわ
472 名前:デフォルトの名無しさん mailto:sage [2018/02/27(火) 21:09:42.50 ID:PLAOSS1/.net] Ruby でも、 'こんにちは。'.gsub(/(.)+/, $1) #=> "。"
473 名前:デフォルトの名無しさん mailto:sage [2018/02/27(火) 22:02:02.32 ID:u9k8VAiO.net] >>459 .NETはCaptureCollectionってのに入れてくれるみたいよ ただフルマッチとキャプチャリンググループと両方1度に必要なければ /(.){1}/みたいに正規表現変えれば配列に入れられるよね
474 名前:デフォルトの名無しさん mailto:sage [2018/02/28(水) 21:03:30.09 ID:V9ixSdqS.net] >>457 すみません。 教えて頂いたサイトを見ても分かりません。 簡単に解説をお願いしたいのですが。
475 名前:デフォルトの名無しさん [2018/02/28(水) 22:05:09.20 ID:pxJOkH76.net] 単純に最後にマッチした部分ってことじゃないかな。赤ラクダにそう書いてある。 C# は知らない。誰か翻訳してあげて。
476 名前:デフォルトの名無しさん mailto:sage [2018/03/01(木) 00:07:23.55 ID:UkKloD3U.net] >>462 キャプチャグループに量指定子がついてるとそのキャプチャグループの箇所に複数回マッチする可能性があるよね。 んで複数回マッチした場合は最後にマッチしたやつがそのキャプチャグループに入ってるってこと "こんにちは。”に対して、/(.)+/でマッチをかけると 最初にピリオドが“こ”にマッチしてそれをグループ1に入れて 次に+を見てまたマッチするか繰り返す 今度はピリオドに”ん”がマッチするからそれをグループ1に入れて、、、 あとは繰り返し “こんにちは。”が/(.)+/にフルマッチした時点でグループ1に入ってるのは”。”
477 名前:デフォルトの名無しさん mailto:sage [2018/03/01(木) 00:17:03.42 ID:ikcjc59H.net] /(.+)/ =~ 'こんにちは。' $1 は、'こんにちは。' /(.)+/ =~ 'こんにちは。' $1 は、'。' 上は、1回しかマッチしていない、最長マッチ。 下は、1文字のマッチで、6回マッチして、最後のマッチが、'。'
478 名前:デフォルトの名無しさん mailto:sage [2018/03/01(木) 00:55:21.78 ID:UkKloD3U.net] >>465 うーん、1文字マッチで6回マッチするのはどっちも同じじゃない? キャプチャグループに入れる回数の違い
479 名前:デフォルトの名無しさん [2018/03/01(木) 02:58:48.22 ID:ksBcbegD.net] >>464 なるほど。
480 名前:デフォルトの名無しさん mailto:sage [2018/03/01(木) 05:29:23.47 ID:AobHbkwq.net] 詳細 ○○表現 尼での評価がよかったので買ってみたが全然 リファレンスにもならない やっぱり海外の訳本はだめだ、すくなくとも自分には良書でなかった
481 名前:デフォルトの名無しさん mailto:sage [2018/03/01(木) 15:52:15.50 ID:UkKloD3U.net] フクロウ本のことかな 中の仕組みを理解するための本であって リファレンス本でも入門書でもないからね
482 名前:デフォルトの名無しさん mailto:sage [2018/03/02(金) 09:24:29.36 ID:O5NS5hyG.net] >>466 そういうマッチャー自分で作る時はスキップするよう作るけど 正規表現エンジンはしないのか 複雑だとやってられないとかか
483 名前:デフォルトの名無しさん [2018/03/02(金) 13:01:46.53 ID:btKfsNEv.net] 試しに for pat in '([cd])+' '(.)+' '.*(.)' ; do perl -Mre=debug -e '$pat = shift; print "abcd" =~ /$pat/ ,"\n" ;
484 名前:' "$pat" ; done ってやってみた。最適化してそうだ。.*(.) は意味的には同じだと思うがバックトラックの分だけ不利。 Perl のソースコードを確認したわけではないので断定はしかねるが。 [] [ここ壊れてます]
485 名前:デフォルトの名無しさん mailto:sage [2018/03/03(土) 08:34:43.98 ID:ooAwkD9v.net] 今はサンプルだからいいけど 長大な文章じゃスキップで最適化しないとやってられないよな
486 名前:469 [2018/03/03(土) 13:47:58.16 ID:GJwmn3yF.net] 個人的には (.)+ と書くべき理由が思い当たらない。
487 名前:デフォルトの名無しさん mailto:sage [2018/03/04(日) 15:44:40.85 ID:QUMop1Gl.net] 正規表現とギターの速弾きが出来る奴は賢いと尊敬している
488 名前:デフォルトの名無しさん mailto:sage [2018/04/06(金) 19:38:34.22 ID:U5C29TI1.net] 複数のSQL文の書かれているSQLファイルから、DBの処理単位でSQL文を逐次取り出す正規表現が書きたいのですがどうしたら良いですか? 厳密なものでは無くても良くて英文字から始まってセミコロンで終わるというもので良いのです。 ただ、SQL分は行頭から始まるとは限らず、セミコロンの直後に次のSQL文が始まったり、空白文字などがあってからSQLの文が始まったりすることもあります。 また、文中に出てくるエスケープされたセミコロンや文字列中のセミコロンは文末の対象になって区切られては困るのでそれはスキップして評価がしたいです。
489 名前:デフォルトの名無しさん mailto:sage [2018/04/06(金) 22:09:42.71 ID:witjIkkr.net] 文字列の内外を判断するの難しい・・・・難しくない?
490 名前:デフォルトの名無しさん [2018/04/07(土) 12:21:20.06 ID:BRhgC8GS.net] multilineのオプション付けて ;でsplitしただけじゃだめなん
491 名前:デフォルトの名無しさん [2018/04/07(土) 12:23:00.56 ID:BRhgC8GS.net] >>476 それが含まれる時点で無理に正規表現一行で書くのはいつもあきらめる
492 名前:デフォルトの名無しさん mailto:sage [2018/04/07(土) 12:30:00.76 ID:LBmouzwW.net] ちゃんとやるなら文字列中のエスケープされたシングルクォートとかも処理しないとダメだし正規表現でやるのはすごく大変だと思う
493 名前:デフォルトの名無しさん mailto:sage [2018/04/07(土) 12:57:57.77 ID:wQfk+GMe.net] 正規文法ではかなり厳しい印象で, BNFの管轄だと思うおよね
494 名前:デフォルトの名無しさん [2018/04/08(日) 06:27:09.85 ID:1mmlbc0v.net] 1. ; で分割して、配列に入れる 2. 配列の各要素から、余分なものを削除する 2 のルールを、厳格に決めればよい Ruby で作る方が速い
495 名前:デフォルトの名無しさん [2018/04/08(日) 11:04:16.11 ID:YK+KPtHu.net] 正規表現は置いといて DB用意して""で囲まれた部分をテキストとしてDBに入れながらID取得 本文側はIDに置き換える あとは正規表現を使っても使わなくてもいいが;で分割 最後にまたID部分に元のテキストを流し込む
496 名前:デフォルトの名無しさん [2018/04/08(日) 13:00:20.92 .net] そこであきらめんなよ! 正規表現だけで乗り切ろうという気概を見せろよ!
497 名前:デフォルトの名無しさん mailto:sage [2018/04/08(日) 13:08:05.41 ID:wO4VFvVz.net] (シングル|ダブル)クオート文字列って正規言語で表せる範囲にあるんかね? 文脈自由言語では表せるけど
498 名前:デフォルトの名無しさん mailto:sage [2018/04/08(日) 13:27:19.00 ID:aPw27k7Z.net] どの正規表現がつかえるのかがわからん 環境を明示してくれないとなー
499 名前:デフォルトの名無しさん mailto:sage [2018/04/08(日) 18:18:43.83 ID:1mmlbc0v.net] /\"([^\"]*)\"/ =~ 'a"bc"d' $1 #=> bc "〜" で、〜には、" 以外の文字列が入る
500 名前:デフォルトの名無しさん mailto:sage [2018/04/08(日) 18:28:48.48 ID:aPw27k7Z.net] "のエスケープや'もあるし 'a"b\"c'd"e'
501 名前:473 mailto:sage [2018/04/09(月) 10:33:55.69 ID:Q+cYQrXX.net] 沢山ご回答ありがとうございます。 皆さんのご意見を伺った限り、やはり正規表現一本では難しそうですよね… はじめは前処理で既成のsqlパーサなどを通して、きれいに整形して別ファイルに保存してから処理する方法も検討していましたが、 できれば現物ファイルを生のまま読み込んで正規表現でなんとか行けないかなと思い試行錯誤していて、 うまい書き方が全然できなくてここに書き込みさせて頂いた次第です。 >>485 使用できる正規表現はPCREです。 具体的にはPHPで省メモリで巨大なSQLファイルを実行する仕組みが作りたくて 相談させてもらいました。自分の頭の中のアイデアでは 1.fileをbufsize分readして 2.正規表現でマッチするかチェック 3.マッチしていたらそのSQLを実行。マッチした文より、先の部分は次の実行のためにバッファに積んで1へもどる 4.マッチしていない場合は更にbufsize分read、2->4を繰り返す。 こんなイメージでした。 それを鑑みると、>>482 さんのアイデアはちょっとありかなとも思います。 スレ違いなっちゃいますが、regexを使わずプログラム上でクオートの始まりと終わりを正しく 処理できれば随分楽できそうな気がします。一考の余地ありですかね?
502 名前:デフォルトの名無しさん [2018/04/09(月) 12:10:15.13 ID:M/BmQ9Z1.net] "'", "\"" '"', '\'' クォーテーション内にクォーテーションがある、入れ子状態が難しい。 クォーテーションを、\ でエスケープしたりもあるし XML Parser とか、プログラム実行の命令木とか、解析ツールを使わないと無理。 プログラミングで何とかできる、範囲を超えている そもそも、入れ子状態にどういうパターンがあるのか、 全列挙して考えるのが、非常に難しい 入れ子の入れ子とか、再帰的に入れ子するかも知れないし
503 名前:デフォルトの名無しさん mailto:sage [2018/04/09(月) 17:17:14.98 ID:4vJW9Ikj.net] >>488 こういう感じでどうだろう [a-zA-Z](?:\\"|\\'|[^"';]|(["'])(?:\\\1|(?:(?!\1).))*(?<!\\)\1)*; 英数字で始まって、\"や\'は許す;で終わる文字列 頭に^\s*を付けたほうがいいかもしれないけど 文字列は、" ' "、' " '、" \" "、' \' 'は許す( ; もOK) ところで、" ' " ' "とは書けるんだっけ? こういう括弧のネストが可能なら、正規表現の方もネスト構文や条件構文を使わないといけないけど (俺は使ったことはないけど)
504 名前:デフォルトの名無しさん mailto:sage [2018/04/09(月) 17:44:25.66 ID:4vJW9Ikj.net] ただし↑は、コメント文はないものとしてのこと
505 名前:デフォルトの名無しさん mailto:sage [2018/04/09(月) 19:00:46.18 ID:4vJW9Ikj.net] さっそくダメだった "\\"
506 名前:デフォルトの名無しさん [2018/04/10(火) 00:21:39.82 ID:oEQHPFsL.net] 仕様を確定させるのが難しい。 単なるテキストには、ルールが無いだろ XML とか、プログラム言語には、仕様があって、 ルール違反の書き方を許さないから、プログラムで判定できる だから、まずこう書いたらエラーにする、という仕様を決めるべき
507 名前:デフォルトの名無しさん mailto:sage [2018/04/10(火) 01:17:02.18 ID:IM3kTV8x.net] >>493 https://ronsavage.github.io/SQL/sql-2003-2.bnf.html こいつのcharacter string literalとか読め ちゃんと規格化されてるんだからさ その上で正規表現で書くのは難しいって話
508 名前:デフォルトの名無しさん [2018/04/11(水) 13:14:45.93 ID:p/bo/Ju1.net] 試しに Perl でやってみた。最も楽観的な想定ならこのくらいまでは手抜きできる。 use strict; my $comment = qr/(?:--.*?\n)/ ; my $literal_ch = qr/(?:\'\'|[^\'])/ ; my $ch_str_literal = qr/(?:\'(?>$literal_ch*)\')/ ; my $other_ch = qr/[^\';]/ ; my $some_str = qr/(?:$comment|$ch_str_literal|$other_ch)/ ; my $statement = qr/(?:$some_str*;)/ ; my $text = ''; while (<>){ $text .= $_; while ( $text =~ s/^$statement// ){ print("Found:$&\n") }} 文字列リテラルの中の文字の記法に特に対処すべき拡張があるなら $literal_ch に加えれば良い。 " は識別子を書くためのものだが '、;、-- のどれかが入る可能性があるなら $other_ch と $some_str に加えればいいだろう。 多分、問題はそこではない。この例では行単位の入力だから面倒な問題を回避できているが、そうでない場合の問題だ。 たとえばコメントの始まりの - までしか読まれていないという場合。もっと読まなければコメントかどうか判断できない。 あるいは文字列リテラルの中で ' が現れた場合。それは文字列リテラルの終わりなのか、それともリテラルの ' を表す '' の 1 文字目なのか。 こういう処理を自分で書くのは難しくはなくても面倒だし、処理速度も遅い。だから結局 flex を使ったりする。
509 名前:デフォルトの名無しさん mailto:sage [2018/04/11(水) 14:19:31.82 ID:jfPKheqL.net] 仕様通りのParser とか、構文解析ツールが必要 それらを使って出力された、抽象構文木を使うのがよい
510 名前:デフォルトの名無しさん mailto:sage [2018/05/04(金) 19:16:13.25 ID:kVAlpXQV.net] ★タイトル ★★タイトル 上のものにマッチさせたいのですが、 ^★.*$ としてしまうと、下まで含まれるのですが、どうしたらいいでしょうか
511 名前:デフォルトの名無しさん mailto:sage [2018/05/04(金) 19:36:12.61 ID:eD01Afe2.net] >>497 ^★(?! ★).*$
512 名前:495 mailto:sage [2018/05/04(金) 21:14:35.89 ID:L0LZvRGB.net] 半角SP紛れ込んだわ ^★(?!★).*$
513 名前:デフォルトの名無しさん mailto:sage [2018/05/05(土) 05:47:27.14 ID:iaqxNbgL.net] ↑解答どうも できなかったです ちなみにmeryというテキストエディタの正規表現です 何の言語かはわかりませんが
514 名前:デフォルトの名無しさん mailto:sage [2018/05/05(土) 06:26:09.87 ID:O3up5M1Q.net] https://regex101.com/r/YyXfr8/1 鬼雲みたいだし動くと思うんだけど, 先頭とか末尾に余計なスペース入ってない?
515 名前:デフォルトの名無しさん mailto:sage [2018/05/05(土) 19:07:12.77 ID:iaqxNbgL.net] ↑ありがとうございます。行けました。 .*の前に否定を入れればいいんですね
516 名前:デフォルトの名無しさん [2018/05/05(土) 21:57:45.66 ID:+tF+3NSL.net] 鬼雲…だと…?!
517 名前:デフォルトの名無しさん mailto:sage [2018/05/07(月) 13:28:13.91 ID:XtvW294Z.net] 正規表現をちゃんと論理的に導きたいと思って参考になる本を 買ったら必要な予備知識に群とか環が出てきて即諦めた 正規表現周りの開発をしてる人達はすごい人達なんだなぁ すごさを直で実感出来た
518 名前:デフォルトの名無しさん [2018/05/07(月) 14:59:22.19 ID:QMgv+0U5.net] 用語に慣れてないだけだろ やってることは大したことじゃない
519 名前:デフォルトの名無しさん mailto:sage [2018/05/07(月) 18:08:31.65 ID:XtvW294Z.net] まぁ膨大な時間と労力をかければ自分にも分かるんだろうけど 現実的じゃないんだよなぁ(人の何倍も時間かかるだろうし) これからは正規表現技術者の努力に感謝しながら正規表現を 使おうと思います(^^)>
520 名前:デフォルトの名無しさん mailto:sage [2018/05/14(月) 07:31:45.21 ID:0PI4I4+g.net] JavaScriptによる正規表現チェッカー くっそ長いので短縮 https://goo. gl/CE3aZ8 https://fatiherikli.github.io/fil/#eyJwYXRoIjoiSmF2YVNjcmlwdFRlc3QxLmpzIiwic291cmNlIjoiLyog5q2j6KaP6KG o54++44Oe44OD44OB44OG44K544OIICovXG5cbi8vIOato+imj+ihqOePvlxudmFyIHJlID0gbmV3
521 名前:IFJlZ0V4cCgv XFxkKy9nKTtcblxuLy8g44OG44Kt44K544OIXG52YXIgdGV4dCA9IChmdW5jdGlvbiAoKSB7LypcbmFhYVxuYmIx MmJcbmM1NjdjYzg5XG4qL30pLnRvU3RyaW5nKCkuc3BsaXQoL1xcbi8pLnNsaWNlKDEsLTEpO1xuXG5jb25zb2x lLmxvZyhcIlJlZ0V4cDpcIiwgcmUudG9TdHJpbmcoKSlcbmNvbnNvbGUubG9nKFwiVGV4dDpcIiwgdGV4dCk7XG5c bnRleHQuZm9yRWFjaChmdW5jdGlvbihsaW5lKSB7XG4gICAgY29uc29sZS5sb2coXCJsaW5lOlwiLCBsaW5lKTtcbiA gICB2YXIgcmVzdWx0ID0gbGluZS5tYXRjaChyZSk7XG4gICAgaWYocmVzdWx0KVxuICAgICAgICBjb25zb2xlLmxv ZyhcInJlc3VsdDpcIiwgcmVzdWx0KTtcbiAgICBlbHNlXG4gICAgICAgIGNvbnNvbGUubG9nKFwicmVzdWx0OlwiLCBcIm51bGxcIik7XG59KVxuIn0 [] [ここ壊れてます]