- 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以降
- 554 名前:デフォルトの名無しさん mailto:sage [2018/06/25(月) 21:12:44.36 ID:lRi8bnr9.net]
- 13桁を超えていても候補として受け取っておいて
チェックデジットの計算の手前で落とします。 どうもありがとうございました。
- 555 名前:デフォルトの名無しさん mailto:sage [2018/06/26(火) 18:51:05.99 ID:PFtq6YS9.net]
- 文字列の先頭の文字以外を*に変換する
というのはどう書けばいいでしょうか?
- 556 名前:デフォルトの名無しさん [2018/06/26(火) 20:16:27.74 ID:IMFKH44M.net]
- こういうこと?
$perl -pe 's/(?!^)./*/g' alpha a**** beta b*** gamma g**** $ 良い方法かどうかはわからないが。
- 557 名前:デフォルトの名無しさん [2018/06/26(火) 20:22:51.32 ID:IMFKH44M.net]
- perl -pe 's/(?<!^)./*/g'
とすべきだったかな。
- 558 名前:デフォルトの名無しさん [2018/07/04(水) 22:06:49.23 ID:gFgZc5FG.net]
- J1Q
- 559 名前:デフォルトの名無しさん mailto:sage [2018/07/05(木) 16:31:37.58 ID:AeL6VB/V.net]
- J1Q
- 560 名前:デフォルトの名無しさん [2018/07/16(月) 14:08:24.67 ID:80hpbb9v.net]
- 1 2 3 の3つの文字を、順番不同で、必ず各々、1つ以上含む
a23b1 → 真 1a2 → 偽 これは順番の組み合わせだから、正規表現で出来ますか?
- 561 名前:デフォルトの名無しさん [2018/07/16(月) 14:41:45.67 ID:/+vnEc6c.net]
- >>544
先読みが使えれば ^(?=.*1)(?=.*2)(?=.*3)
- 562 名前:デフォルトの名無しさん [2018/07/25(水) 19:56:10.60 ID:1XdhMp/e.net]
- サクラエディタで
<>で囲まれていないaaaをあああにしたいです <aaab>aaa<caaadaaa>baaadeaaa<ccc>baaad<baaa>aaabaaadaaa<ee> ↓ <aaab>あああ<caaadaaa>bあああdeあああ<ccc>bあああd<baaa>あああbあああdあああ<ee> >([^<>a]*?)(aaa)([^<>a]*?)< >$1あああ$2< だと「>aaa<」や「>baaad<」は置換できるけど「>baaadeaaa<」や「>aaabaaadaaa<」が置換できずに残る そこで >([^<>a]*?)(aaa)([^<>a]*?)(aaa)([^<>a]*?)< >$1あああ$2あああ$3< と変換するわけですが当然「>aaabaaadaaa<」が残り… <>に囲まれていないaaaが沢山あるので変換しきれません 何とかならないでしょうか
- 563 名前:デフォルトの名無しさん mailto:sage [2018/07/25(水) 20:31:56.63 ID:AmPlbSPQ.net]
- []内のa取っ払って
ぜんぶ変換できるまで何回もやったら? (>[^<]*?)aaa([^>]*?<)
- 564 名前:デフォルトの名無しさん mailto:sage [2018/07/25(水) 20:46:43.74 ID:AmPlbSPQ.net]
- aaa(?=[^>]*<)
前後に必ずタグがあるならこれなら一回
- 565 名前:デフォルトの名無しさん [2018/07/26(木) 09:15:37.25 ID:4NbdqkDU.net]
- >>547>>548
できた!できました! ありがとうございます
- 566 名前:デフォルトの名無しさん mailto:sage [2018/07/29(日) 09:53:04.64 ID:JxpitKP8.net]
- ●
パターン1, (\d+)月(\d+)日 パターン2, (\d+)月(\d+)数字以外(\d+)日 これを一回で取得したい ●対象データ 7月1日 7月2〜4日 7月6から10日 7月12・13日 ●希望する結果 7,1 7,2,4
- 567 名前:
7,6,10 7,12,13 お願いします [] - [ここ壊れてます]
- 568 名前:デフォルトの名無しさん mailto:sage [2018/07/29(日) 10:18:20.53 ID:kCYuy8BN.net]
- 取得って何だよ変数に入ればいいのか置換結果として取得したいのか
- 569 名前:デフォルトの名無しさん mailto:sage [2018/07/29(日) 10:49:28.56 ID:TzC7zb5n.net]
- >>550
ほんまにそれが希望する結果? 数字とりだしてるだけなんだけど。
- 570 名前:デフォルトの名無しさん mailto:sage [2018/07/29(日) 10:59:44.43 ID:JxpitKP8.net]
- 取り出すだけでいいです。
- 571 名前:デフォルトの名無しさん mailto:sage [2018/07/29(日) 11:42:16.30 ID:kCYuy8BN.net]
- 数字取り出して変数に入れるだけなら /(\d+)月(\d+)(?:\D+(\d+))?日/gu で仕舞いだが
- 572 名前:デフォルトの名無しさん mailto:sage [2018/07/29(日) 11:45:23.47 ID:JxpitKP8.net]
- >>554
完璧です。 ありがとうございました。
- 573 名前:デフォルトの名無しさん mailto:sage [2018/07/29(日) 11:49:24.17 ID:kCYuy8BN.net]
- 変数にキャプチャしたいのか置換で取り出したいのかくらい書こうな
- 574 名前:デフォルトの名無しさん mailto:sage [2018/07/29(日) 11:57:08.75 ID:JxpitKP8.net]
- 失礼しました
- 575 名前:デフォルトの名無しさん mailto:sage [2018/08/12(日) 20:55:52.79 ID:MOc1ccj1.net]
- C#で正規表現を使ってHTML内から文字コードをとってきたいのですが
以下の場合だと"UTF"としか取得できません。 "UTF-8"と取得する場合どうすればいいでしょうか? <[^>]*\bcharset\s*=\s*[""']?(?<charset>\w+)\b <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8">
- 576 名前:デフォルトの名無しさん mailto:sage [2018/08/12(日) 21:30:40.27 ID:mMH07JtW.net]
- >>558
HTMLは扱いが難しいからパーサ使った方がいい どうしても正規表現だというなら, 1. とりあえず的な修正 https://regex101.com/r/sIUmzD/2 /<[^>]*\bcharset\s*=\s*(?:([^\s"'=><`]+)|'([^']*)'|"([^"]*)")\b/$1$2$3/i 2. もう少し気合の入れた修正 https://regex101.com/r/sIUmzD/1 |<meta (?:\s+[^\s"'>/=]+(?:\s*=\s*(?:[^\s"'=><`]+|'[^']*'|"[^"]*"))?)* (?:\s+charset(?:\s*=\s*(?:([^\s"'=><`]+)|'([^']*)'|"([^"]*)"))?) (?:\s+[^\s"'>/=]+(?:\s*=\s*(?:[^\s"'=><`]+|'[^']*'|"[^"]*"))?)*\s*/?>|$1$2$3|i ぐらいか でもこれ後で読むのしんどいでしょ
- 577 名前:デフォルトの名無しさん mailto:sage [2018/08/12(日) 21:47:08.19 ID:L571MbNB.net]
- >>559
神だ
- 578 名前:557 mailto:sage [2018/08/12(日) 21:53:09.85 ID:mMH07JtW.net]
- 2.の方を若干修正, charsetには値が必要ですわ
https://regex101.com/r/sIUmzD/3 |<meta (?:\s+[^\s"'>/=]+(?:\s*=\s*(?:[^\s"'=><`]+|'[^']*'|"[^"]*"))?)* (?:\s+charset\s*=\s*(?:([^\s"'=><`]+)|'([^']*)'|"([^"]*)")) (?:\s+[^\s"'>/=]+(?:\s*=\s*(?:[^\s"'=><`]+|'[^']*'|"[^"]*"))?)*\s*/?>|$1$2$3|i
- 579 名前:デフォルトの名無しさん mailto:sage [2018/08/12(日) 22:00:37.17 ID:MOc1ccj1.net]
- >>559
ありがとうございます! 当方がやりたかったことは、HTMLをテキストデータとして大量に取得して、その中から特定のワードでの絞り込みです。 正しい文字コードでHTMLを落としてからパースしようと思ったのですが、確かにパーサでやる手もありそうですね 正規表現は今まで避けてきたので、読むのがシンドイっていうかチンプンカンプンですが 求めていた動作です。とても助かりました。 使わせてももらいます。ありがとうございました。
- 580 名前:デフォルトの名無しさん mailto:sage [2018/08/12(日) 23:56:24.69 ID:2UQfVx23.net]
- HTML のように、要素に親子関係があるもの・構造化されたものは、正規表現じゃ無理
<1><x></x><y></y></1> 開き・閉じタグで、前から一致させると、 <1></x> が対応してしまう ネストも無限にできるから、対応させるのは無理。 パーサを使うべき
- 581 名前:デフォルトの名無しさん mailto:sage [2018/08/13(月) 00:16:51.60 ID:06GD6VnQ.net]
- キーワードと構成次第だろ
- 582 名前:デフォルトの名無しさん mailto:sage [2018/08/13(月) 00:22:13.35 ID:LXDaPxOa.net]
- rubyキチやぞ
- 583 名前:デフォルトの名無しさん mailto:sage [2018/08/13(月) 03:34:58.19 ID:EnLsbSTB.net]
- >>563
一部の環境では括弧等のネスト構造を取り扱いをサポートした正規表現があるよ PCRE(Perl 5.10以降)やruby(鬼雲)、Python,PHPなどでも C#の.NET Framework環境でもあったんじゃないかな
- 584 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 19:11:59.52 ID:4kav5HXR.net]
- .*
何にでもマッチさせることができる最強で万能な正規表現
- 585 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 19:26:33.22 ID:FR6Db0Vc.net]
- 改行にはマッチしないけどね
[\s\S]*
- 586 名前:デフォルトの名無しさん mailto:sage [2018/08/24(金) 02:29:36.02 ID:cgE41D9D.net]
- >>563
> HTML のように、要素に親子関係があるもの・構造化されたものは、正規表現じゃ無理 そういうこともできるように拡張した正規表現があればいいのに さらに階層、treeも可
- 587 名前:デフォルトの名無しさん mailto:sage [2018/08/24(金) 03:56:55.93 ID:k/tOxHF9.net]
- >>569
鬼雲使ってみれば?
- 588 名前:デフォルトの名無しさん mailto:sage [2018/08/24(金) 10:28:37.49 ID:bF2ATmvV.net]
- BNF使えよ
- 589 名前:デフォルトの名無しさん mailto:sage [2018/08/24(金) 10:38:07.25 ID:wb3Q/jKx.net]
- なんか知識が数年前で止まっちゃってる人がちらほらいるな
正規表現がネストに対応したのなんてもう一昔前ってイメージだけど
- 590 名前:デフォルトの名無しさん mailto:sage [2018/08/24(金) 12:46:08.34 ID:srP6ovAZ.net]
- 別に正規表現だけを追いかけてるわけじゃないから
- 591 名前:デフォルトの名無しさん [2018/08/24(金) 12:48:35.65 ID:ZVlysGry.net]
- なんでも正規表現で済まそうとするひとって
意地でもVBA使い続けてるひとと大差ない
- 592 名前:デフォルトの名無しさん mailto:sage [2018/08/24(金) 12:49:36.87 ID:yKVFr0CJ.net]
- 適材適所
- 593 名前:デフォルトの名無しさん mailto:sage [2018/08/24(金) 16:58:29.09 ID:k/tOxHF9.net]
- >>569
てか>>563には>>566のレスが既に付いてたじゃんか
- 594 名前:デフォルトの名無しさん mailto:sage [2018/08/24(金) 18:58:08.09 ID:wb3Q/jKx.net]
- >>574
賢い人程手段をたくさん知り その中から取捨選択するからな >>573 さすがに勉強不足すぎだろw 何年前で知識止まってんだよ
- 595 名前:デフォルトの名無しさん mailto:sage [2018/08/25(土) 00:03:35.46 ID:r5O9PJUC.net]
- はいはい、正規表現マスターすごいねー
これでいいかな w
- 596 名前:デフォルトの名無しさん mailto:sage [2018/08/25(土) 00:35:41.84 ID:I7tIpqHO.net]
- 底辺に行くほど知識自慢はしかたがないだろ、正規表現に限らず
ただ掲示板的に質問したいのにバカがしゃしゃり出てきて迷惑だよな
- 597 名前:デフォルトの名無しさん [2018/08/25(土) 10:52:22.58 ID:J+b/MRtJ.net]
- 的確な指示されても気に入らない回答だからと人の話を聴かない人は成長しないよ
自分の気に入る回答しかも自分と同じレベルの回答もらって喜んでればいい
- 598 名前:デフォルトの名無しさん mailto:sage [2018/08/26(日) 15:08:37.66 ID:sCPJIsfv.net]
- 俺なんか中学の勉強もロクにしなかったのに正規表現を理解したいから
今、大学レベルの数学を勉強してる・・なかなか進まないけどね・・ >>558 の質問からパーサとか出てくるのはちょっと違うと思うよ metaタグ拾えばいいだけだよね?難しく考えすぎだよ あとHTMLソースのほうが糞で実際の文字コードとmetaタグで指定されてる 文字コードが違うなんてことや、文字コードの指定が複数個所あるなんていう 2ページ分のHTMLをそのままくっ付けましたなんていうのも稀にあるから そういう糞なHTMLを相手にする場合は対応を考えないといけないね
- 599 名前:デフォルトの名無しさん mailto:sage [2018/08/26(日) 15:31:19.41 ID:CE5Lnwmj.net]
- >>581じゃあmetaタグを拾って来る正規表現をどうぞ
- 600 名前:デフォルトの名無しさん mailto:sage [2018/08/26(日) 15:37:54.94 ID:zPuf2RGr.net]
- え? そんなことマジで聞いてるのか?
- 601 名前:デフォルトの名無しさん mailto:sage [2018/08/26(日) 15:40:08.95 ID:CE5Lnwmj.net]
- マジだからちゃんと教えてくれよ
- 602 名前:デフォルトの名無しさん mailto:sage [2018/08/26(日) 18:08:41.45 ID:sCPJIsfv.net]
- 自分用に作るならこんな感じかなぁ、動作確認してないので使わないでね
| <meta (?=\s) [^<>]* \s charset \s* = \s* (?:["']\s*)? ([^\s"'<>;]+) |x; こういうのは想定外 ※ " " の中に > がある <meta comment="a>b" charset="UTF-8">
- 603 名前:デフォルトの名無しさん mailto:sage [2018/08/26(日) 18:17:10.61 ID:O4hA/SKg.net]
- >>585
俺が書いた糞(>>561)より糞なコードが書かれて驚く 素直にパーサ使えよ
- 604 名前:デフォルトの名無しさん mailto:sage [2018/08/26(日) 18:36:53.61 ID:sCPJIsfv.net]
- >>585 のほうがスマートなのは一目瞭然でしょ
ただ >>585 は こんな感じ 程度のものなのでツッコミ所があっても知らないよ
- 605 名前:デフォルトの名無しさん mailto:sage [2018/08/26(日) 18:37:23.43 ID:5oVMxLBv.net]
- mataタグでのcharsetは定型的でしか使われないんで、仕様的に色々な場合に対応するのは無駄
俺が使うなら、こんなので十分 /<meta[^>]*\scharset=(["'])((?:(?!\1).)+)/i
- 606 名前:デフォルトの名無しさん mailto:sage [2018/08/26(日) 18:52:21.33 ID:sCPJIsfv.net]
- ほとんどの場合はそれで充分だろうねw
- 607 名前:デフォルトの名無しさん mailto:sage [2018/08/27(月) 04:46:33.83 ID:2QlJLeh2.net]
- マッチングテスト
[1] <meta charset="UTF-8"> >>559 1. 失敗 >>561 マッチ >>585 マッチ >>588 マッチ [2] このスレのHTML 557 1. マッチ 559 失敗 583 マッチ 586 失敗
- 608 名前:デフォルトの名無しさん mailto:sage [2018/08/29(水) 16:43:59.44 ID:4UnjToZE.net]
- こんなバカが回答者してたのか
過去レス見ると前から張り付いてるようだね
- 609 名前:デフォルトの名無しさん mailto:sage [2018/08/31(金) 20:05:36.75 ID:5NewXZva.net]
- なかなか興味深い
鬼雲に非包含オペレータを実装した話 https://qiita.com/k-takata/items/4e45121081c83d3d5bfd
- 610 名前:デフォルトの名無しさん mailto:sage [2018/08/31(金) 21:09:12.34 ID:5NewXZva.net]
- bregonig.dll 2017/01/17 Ver.4.10 非包含オペレータに対応
うーん、非包含にマッチする正規表現はいつか自分で作れるように なりたいと思ってたけど内部で勝手に作ってくれる時代になってしまったか〜 自分の知識は2013あたりで止まってるから浦島だ
- 611 名前:デフォルトの名無しさん mailto:sage [2018/09/01(土) 01:28:06.31 ID:0IlLcsWm.net]
- ab(?~ba)ba
これを ab((?!ba).)*ba この従来通りの方式をベースに記述して、かつ、前者とまったく同じ 動作に書き直すことは可能かな? 両者の違いについては>>592のリンク参照
- 612 名前:デフォルトの名無しさん mailto:sage [2018/09/01(土) 22:17:13.09 ID:0IlLcsWm.net]
- (?~abc)
これは↓とまったく同じ動作になると言って良さそう (?:(?!abc).)*(?:(?=abc).{1,2})? 否定したい文字列が固定長なら先読みで書き換え可能らしい
- 613 名前:デフォルトの名無しさん mailto:sage [2018/09/12(水) 19:47:12.85 ID:j29ToL0A.net]
- 正規表現を言語化できるようなとこ知りませんか?
/^ab/ これを入れると、 ↓ 「abで始まる」 と変換されるようなサービスって無いでしょうか?
- 614 名前:デフォルトの名無しさん [2018/09/13(木) 09:47:15.83 ID:l9KSlvFS.net]
- せっかく正規表現にした意味が無い
- 615 名前:デフォルトの名無しさん mailto:sage [2018/09/13(木) 09:50:19.09 ID:NoauaeTl.net]
- https://jex.im/regulex/#!flags=&re=%5Eab
- 616 名前:デフォルトの名無しさん mailto:sage [2018/09/13(木) 13:28:20.78 ID:a9m+mGXQ.net]
- 視覚的に見れるサイトじゃなくて視覚的に作れるサイトがあったら便利かな
メタ文字を覚える必要が無くなるし動作を把握しながら作れる そういうのが普及したらいいね
- 617 名前:デフォルトの名無しさん mailto:sage [2018/09/14(金) 00:35:39.11 ID:qC9qAPWt.net]
- そういうのとはちょっと違う&grepツールになっちゃうけど
TresGrepってのが入力欄でのマウス右クリックから正規表現を指定出来たり 正規表現1文字入力ごとにエラーチェック⇒NGならエラーメッセージを表示したりと ちょっと便利
- 618 名前:デフォルトの名無しさん mailto:sage [2018/09/14(金) 06:51:39.20 ID:LTbXVNEK.net]
- >>598
これいいですね。 ありがとうございます。
- 619 名前:デフォルトの名無しさん mailto:sage [2018/09/14(金) 14:14:58.44 ID:grBP2MzP.net]
- TresGrep使ってみたけど良くできてる
正規表現に何かしらの思い入れがあるのが分かる気がする 特に正規表現の複数行入力が出来るのはいい 自分は複数行入力が当たり前になるべきだと前から考えていて それが実装されててちょっと感動してしまった
- 620 名前:デフォルトの名無しさん mailto:sage [2018/09/17(月) 12:06:03.62 ID:SR+usNFF.net]
- C#、System.Text.RegularExpressions.Regexの正規表現で
xxの中を取り出すにはどうしたらいいのでしょう? ただし取り出したいのはトップのxxで、xxが閉じる前にyyがあるときはそのxxは無視という条件付きです 対象文字列 "<xx><xx><yy>111</yy></xx></xx><xx>223</xx><xx>334</xx>"; 試した正規表現 @"<xx>.*?[^(</yy>)]</xx>" 結果 <xx><xx><yy>111</yy></xx></xx><xx>223</xx> <xx>334</xx> 欲しい結果 <xx><xx><yy>111</yy></xx></xx> <xx>223</xx> <xx>334</xx>
- 621 名前:デフォルトの名無しさん mailto:sage [2018/09/17(月) 13:51:51.89 ID:tNilsymD.net]
- プログラムとはちょっと違うのですが、2chMateで荒らしをNGする正規表現を作りたくて悩んでます
日本語で書くと、 ""又は"https://"が合わせてn回以上出てきた場合(対象は複数の改行を含む文字列) にマッチするような正規表現って可能でしょうか?
- 622 名前:デフォルトの名無しさん mailto:sage [2018/09/17(月) 14:52:47.98 ID:QtMg2HjE.net]
- >>603
結果と欲しい結果の違いが改行しかないような >>604 n=3 (?si:https?:\/\/.*?){3,}
- 623 名前:602 mailto:sage [2018/09/17(月) 15:04:16.06 ID:tNilsymD.net]
- >>605
迅速なご回答ありがとうございます。 この方法でうまくいきました!
- 624 名前:デフォルトの名無しさん mailto:sage [2018/09/18(火) 00:00:11.49 ID:lHFpavF+.net]
- >>603
.NET Frameworkの正規表現は知らんけど、鬼雲でなら (?=<xx>)(<(\w+)>([^<]*|\g<-3>)*</\k<-2-0>>) これは最低限のものでイレギュラーなものには対応しない 文字列でエスケープされてるとかコメントが入ってるとか タグにタグ名以外の余計なものが入ってるとか(</a href=...>とか<br />とか) ペアでないタグがあるとか(<br>のような単独タグ,<xx>と</xx>のどちらかしかないとか) そういうのにも対応させるなら工夫して 一応、.NET Frameworkの正規表現の再帰については https://qiita.com/HMMNRST/items/15800514bbe66f504789
- 625 名前:デフォルトの名無しさん mailto:sage [2018/09/18(火) 00:12:00.46 ID:oPOmCM6y.net]
- ありがと。もう少し単純にできるかと思っていたけどそんなに複雑になるのね
正規表現使わずにやる方向で考えてみます
- 626 名前:583 mailto:sage [2018/09/18(火) 00:55:53.38 ID:t0fL3l18.net]
- >>607のリンク先見てやっつけで作ってみた
<xx>(?>(?:(?!</?xx>).)*)</xx>|<xx>((?'open'<xx>(?>(?:(?!</?xx>).)*))+(?'-open'</xx>(?>(?:(?!</?xx>).)*))+)*</xx>(?(open)(?!))
- 627 名前:デフォルトの名無しさん mailto:sage [2018/09/18(火) 01:11:05.24 ID:0krUYS0m.net]
- 典型的なダメ質問者だな。
- 628 名前:583 mailto:sage [2018/09/18(火) 02:17:30.59 ID:t0fL3l18.net]
- ミスってた、>>609はボツってことで・・
タグとタグの間の文字列の扱いが意外と難しい
- 629 名前:デフォルトの名無しさん mailto:sage [2018/09/18(火) 06:08:34.66 ID:oPOmCM6y.net]
- 確かにダメ質問者w
「xxが閉じる前にyyがあるときはそのxxは無視」という一見簡単そうなルールが予想以上に難しいようで 楽したいから正規表現使いたいのだけどあまり複雑になると楽じゃないからほかに逃げたくなる
- 630 名前:デフォルトの名無しさん mailto:sage [2018/09/18(火) 07:04:18.68 ID:iA/s8q9i.net]
- ぶっちゃけ欲しい結果が何なのか結局よく分かってない
<xx>(?:(?<tag><(?!yy>)(?<tagname>[a-z]+)>)*\d+(?<-tag></\k<tagname>>)*(?(tag)(?!)))*</xx>
- 631 名前:デフォルトの名無しさん mailto:sage [2018/09/18(火) 07:13:00.25 ID:oqy73oSH.net]
- ID変わった
その表現だと <xx><xx><yy>111</yy></xx> 欲しい結果は<xx><xx><yy>111</yy></xx></xx> こういう尻切れになることが多い
- 632 名前:デフォルトの名無しさん mailto:sage [2018/09/18(火) 07:16:10.21 ID:iA/s8q9i.net]
- どういうことよ
>>613の正規表現で <xx><xx><yy>111</yy></xx></xx><xx>223</xx><xx>334</xx> にマッチングすると <xx>223</xx> と <xx>334</xx> にマッチするでしょ? <xx><xx><yy>111</yy></xx> はどこから出てきたの?
- 633 名前:デフォルトの名無しさん mailto:sage [2018/09/18(火) 07:42:45.15 ID:oqy73oSH.net]
- 申し訳ないミス。"<xx>.*?</xx>"の1件目の結果だったw
その正規表現だと2件マッチ 欲しい結果は>>603にある3件
- 634 名前:デフォルトの名無しさん mailto:sage [2018/09/18(火) 07:46:54.65 ID:iA/s8q9i.net]
- > xxが閉じる前にyyがあるときは
これは直前ってこと? <xx><yy>111</yy></xx> にはマッチしないってことでいいの?
- 635 名前:デフォルトの名無しさん mailto:sage [2018/09/18(火) 07:55:40.50 ID:lHFpavF+.net]
- >ただし取り出したいのはトップのxxで
これだけで<yy></yy>があろうがなかろうが良いと俺は思ったんだけど
- 636 名前:デフォルトの名無しさん mailto:sage [2018/09/18(火) 08:27:12.31 ID:iA/s8q9i.net]
- yyがどうでもよければ
<xx>(?:(?:<(?<tag>[a-z]+)>)*\d+(?:</(?<-tag>\k<tag>)>)*(?(tag)(?!)))*</xx> かなぁ
- 637 名前:デフォルトの名無しさん mailto:sage [2018/09/18(火) 08:36:05.56 ID:oqy73oSH.net]
- 閉じる前というのは直前という意味で
対象が"<xx><xx><yy>111</yy></xx></xx><xx>223</xx><xx>334</xx><xx><yy>446</yy></xx>" の場合は、<xx><yy>446</yy></xx>を無視したの3件マッチにしたい >>613と>>619ベースできそうだからがんばってみます。ありがとう
- 638 名前:デフォルトの名無しさん mailto:sage [2018/09/18(火) 09:00:26.56 ID:iA/s8q9i.net]
- まぁスタック使う構文が必要な時点で正規表現向きでないのは間違いない
- 639 名前:583 mailto:sage [2018/09/18(火) 12:56:18.97 ID:t0fL3l18.net]
- 本来の数学的な正規表現という意味では向いてる質問なんだけどね
これぞ正規表現の仕事っていう質問 でもプログラムの検索で使う正規表現ではなかなか使われないね
- 640 名前:583 mailto:sage [2018/09/18(火) 13:25:09.30 ID:t0fL3l18.net]
- >>609を修正
<xx>(?>(?:(?!</?xx>).)*)((?'open'<xx>(?>(?:(?!</?xx>).)*))+(?'-open'</xx>(?>(?:(?!</?xx>).)*))+)*</xx>(?(open)(?!)) これは>>607のリンク先の例を↓のように書き換えただけ < を <xx>・・・ > を </xx>・・・ \A を <xx> \z を </xx> 「・・・」 は<xx>または</xx>の間に挟まれている文字列 >スタック使う構文が必要な時点で ああ、その通りだ、(r+s+)+ だけでは作れない
- 641 名前:583 mailto:sage [2018/09/18(火) 13:29:58.42 ID:t0fL3l18.net]
- 間違い
\A を <xx> 正しくは \A を <xx> ・・・
- 642 名前:583 mailto:sage [2018/09/18(火) 18:51:49.51 ID:t0fL3l18.net]
- >>613のはミスってるね
<xx><b><a>111</a></a></xx> にマッチする <xx><b><a>111</a></b></xx> にマッチしない この問題は>>619で修正されてる ()* \d+ ()* のところが0回以上のループで正しく動くのは面白いな 一番外側の (?: )* はいらないかも
- 643 名前:583 mailto:sage [2018/09/21(金) 05:18:40.73 ID:LI7qokUP.net]
- (?# 主要部)
<xx(?&Attribute)>(?&innerText)(?&roop)?+</xx> (?# 定義部) (?:|(?!) (?'Attribute'(?:\s[^>]*+)?+) (?'singletag'br) (?'tagname'[a-z][a-z\d]*+) (?'innerText' (?: [^<]*+ | <(?&singletag)(?&Attribute)> )*+ ) (?'roop' <(?'tag'(?&tagname))(?&Attribute)> (?&innerText)(?&roop)?+ </\k'tag+0'> (?&innerText)(?&roop)?+ ) )
- 644 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 05:54:00.34 ID:LI7qokUP.net]
- こだわった点
・主要部と定義部に分けて全体の構造が分かりやすくした ・繰り返しは全て強欲。無駄なバックトラックをさせない ・再帰には * を使わず、部分呼び出し自身に繰り返しをさせている ・定義部は (?:|(?!) 〜 ) として定義部がサーチに使われるのを避けている >>607には ([^<]*|\g<-3>)* という部分があって ([^<]*)* というバックトラック処理がえらいことになる部分があって気になった あと再帰を使ってるのにループを * にさせているのを見て * を使わずに書けるはずだと思って作ってみた
- 645 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 06:11:13.31 ID:LI7qokUP.net]
- こういう書き方をした正規表現をサクラエディタで使おうとすると
1行に繋げなければならない、これでは不便すぎる 鬼雲の強力な正規表現を快適に使い倒せるようにするべき 出来れば複数行で書いた正規表現を1行に繋げる機能が欲しい そうすればここのような掲示板に貼るときに便利 逆に1行で書かれた正規表現を複数行に直す機能も欲しい 手動でいちいち改行を入れる手間が省けて快適になる この2つの機能は正規表現ライブラリに実装されることが望ましい そうすれば他のテキストエディタの作者も気軽に実装出来るようになる 正規表現に新しいメタ文字が作られたときの対応も容易になる
- 646 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 06:18:04.46 ID:LI7qokUP.net]
- 出来れば定義用の新しいコマンドが欲しい
定義のためのカッコなのにキャプチャが有効になってたり、 正規表現オブジェクトが無駄に肥大化してしまったりするから
- 647 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 07:17:48.30 ID:fJq/snux.net]
- >>628
> 出来れば複数行で書いた正規表現を1行に繋げる機能が欲しい ここはム板なので言い出しっぺの法則が適用されます
- 648 名前:583 mailto:sage [2018/09/21(金) 19:24:14.97 ID:LI7qokUP.net]
- >>630
テキストエディタの正規表現の入力ウインドウに付けて欲しいんだ 次世代のテキストエディタは↓こうなって欲しい 1、画面をいっぱいに使って正規表現の複数行の記述が出来る 2、複数行で書かれた正規表現を一行に繋げるボタン 3、一行で書かれた正規表現を複数行に展開するボタン これがスタンダードになるといいな
- 649 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 20:42:25.54 ID:c6u7OXiZ.net]
- >>631
ガンバ w
- 650 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 20:44:43.75 ID:OGYiByDT.net]
- やっぱそうなるよな ここではw
- 651 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 23:08:38.86 ID:3+OghnRP.net]
- extendedフラグを付けて鬼雲に渡せば、複数行で処理してくれる。
エディタ側で1行にくっつけたりする必要はない。
- 652 名前:583 mailto:sage [2018/09/21(金) 23:41:08.24 ID:LI7qokUP.net]
- >>634
そういうことじゃないんだな、>>628を読んでね ちなみに複数行の正規表現を一行に繋げるのはかなり簡単なんだけど 一行で書かれた正規表現を複数行に展開するのはかなり難しい 正規表現のパーサを作るということになるから だから正規表現ライブラリに実装されることが望ましい ライブラリの作者なら細かい挙動まで把握しているから正確なパーサが作れる 逆にテキストエディタの作者がやろうとすると動作を把握しきれずに 不完全なものになったり、実装を諦めたりすることになりかねない 複数行をスタンダードにするためにはライブラリ側での実装が必須となる
- 653 名前:デフォルトの名無しさん [2018/09/22(土) 02:13:48.20 ID:EPQO3h7N.net]
- >>635
鬼雲とbregonig.dllの作者さんまでどうぞ https://twitter.com/k_takata https://github.com/k-takata/Onigmo https://github.com/k-takata/bregonig k-takata.o.oo7.jp/mysoft/bregonig.html あと鬼車オリジナルの作者さんも復活してたんだね https://github.com/kkos/oniguruma/issues (deleted an unsolicited ad)
- 654 名前:583 mailto:sage [2018/09/22(土) 21:31:53.89 ID:SLHR4wJP.net]
- >>636
bregonig.dllはプログラミング用のライブラリをテキストエディタでも 使えるようにしたっていう感じなのでプログラミングに必要のない機能は 付けたくないと思う、管理が大変になるからね だから次世代の正規表現ライブラリと次世代のテキストエディタに期待 ちなみにテキストエディタに重きを置いたライブラリならこんなのが可能になるはず 検索:( red(?'color='赤) | blue(?'color='青) | yellow(?'color='黄) ) 置換:\k'color' 対象テキスト: blue 置換結果:青 現状の bregonig.dll でこれが出来ないということはプログラミングでなんとかなる 機能は付けないということ テキストエディタのほうは改行をまたぐマッチの実現に苦戦してるようで この問題が解決しないと高度な正規表現は宝の持ち腐れになるだけなので 次世代のテキストエディタに期待しましょう >鬼車オリジナルの作者さん 別人だとは知りませんでした^^;
|

|