Regular Expressionスレです。
質問する場合は必ず実装言語や処理系ソフトウェア名を示してください。
前スレ
Regular Expression(正規表現) Part16
https://mevius.5ch.net/test/read.cgi/tech/1635936601/
次スレは>>980宜しく
テンプレ>>2以降
探検
Regular Expression(正規表現) Part17
1デフォルトの名無しさん
2023/12/16(土) 08:59:20.50ID:uVHZ7e2j279デフォルトの名無しさん
2025/10/28(火) 01:47:57.16ID:WdB2Psfo 鬼車はJavaScriptの仕様に寄せろと細かいことまで言われて
嫌気がさしたのかなという印象だけど真相は作者のみぞ知るか
ただ最近はDFAキャッシュを使うエンジンの台頭で
これとかboost.regexが速いとされた時代はとうに終わってるんで
マルチバイト対応を必要とする人以外はあまり影響ない気もする
嫌気がさしたのかなという印象だけど真相は作者のみぞ知るか
ただ最近はDFAキャッシュを使うエンジンの台頭で
これとかboost.regexが速いとされた時代はとうに終わってるんで
マルチバイト対応を必要とする人以外はあまり影響ない気もする
280デフォルトの名無しさん
2025/11/02(日) 19:07:30.81ID:vGsY1NrW 「正規表現技術入門」を読むと、GNU grep ではマッチング途中で必要になった部分だけ
オンデマンドで DFA を構成していく On-the-Fly 構成法を使っている、と書かれてるけど
どのレベルから On-the-Fly してるんでしょ ?
部分集合構成法で NFA を DFA に変換する所からなのか、もっと前のε-遷移除去からなのか
あるいはさらに前の正規表現をパースして NFA を作る所も On-the-Fly なんですかね ?
GNU grep のソース見ろと言われそうだけど
オンデマンドで DFA を構成していく On-the-Fly 構成法を使っている、と書かれてるけど
どのレベルから On-the-Fly してるんでしょ ?
部分集合構成法で NFA を DFA に変換する所からなのか、もっと前のε-遷移除去からなのか
あるいはさらに前の正規表現をパースして NFA を作る所も On-the-Fly なんですかね ?
GNU grep のソース見ろと言われそうだけど
281デフォルトの名無しさん
2025/11/02(日) 20:01:30.27ID:JoUIYtII 正規表現の枠を超える後方参照(\1)とかで使ってそう
あれが絡むと事前にDFA作れない
あれが絡むと事前にDFA作れない
282デフォルトの名無しさん
2025/11/02(日) 20:13:48.87ID:JoUIYtII 正則言語の枠か
用語がちょっと怪しい
用語がちょっと怪しい
283デフォルトの名無しさん
2025/11/03(月) 19:15:39.49ID:6hs01YZr >>280
自己レス。AI に聞いたら
| GNU grepでは、DFA の生成に On-the-Fly(実行時逐次的)な手法を採用していますが、
| それは基本的に部分集合構成法を逐次的に行うことを意味します。
| ε遷移の除去も、このプロセスの中で実質的に On-the-Fly で行われます。
とのことでした。やっぱε-除去も On-the-Fly なのか、ムズいなー
>>281
GNU grep の On-the-Fly 法は、到達しない状態ノードを作らないようにすることで
省メモリ化と高速化が目的なので、DFA の構造自体が動的に変わるものではないと思ってました。
で、言われるように後方参照は正規言語のクラスを超えてるので、DFA 型エンジンでは
普通は実現出来ないのだけど、「正規表現技術入門」では
| GNU grep は基本的に DFA 型ですが、部分的(後方参照への対応のためなど)に一部
| VM 型のアプローチもとっています。
とかさらっと書いてあるだけで、具体的な記述はないんすよね (やっぱ入門書だな)。
でも言われてみれば、On-the-Fly 的に動的に DFA を構成して行けば、それで後方参照も
実現出来そうな気がしてきた。バックトラックとか面倒そうだけど一考の価値はあるかも
GNU grep もそうやって実装してる ? かどうかは分からないけど
自己レス。AI に聞いたら
| GNU grepでは、DFA の生成に On-the-Fly(実行時逐次的)な手法を採用していますが、
| それは基本的に部分集合構成法を逐次的に行うことを意味します。
| ε遷移の除去も、このプロセスの中で実質的に On-the-Fly で行われます。
とのことでした。やっぱε-除去も On-the-Fly なのか、ムズいなー
>>281
GNU grep の On-the-Fly 法は、到達しない状態ノードを作らないようにすることで
省メモリ化と高速化が目的なので、DFA の構造自体が動的に変わるものではないと思ってました。
で、言われるように後方参照は正規言語のクラスを超えてるので、DFA 型エンジンでは
普通は実現出来ないのだけど、「正規表現技術入門」では
| GNU grep は基本的に DFA 型ですが、部分的(後方参照への対応のためなど)に一部
| VM 型のアプローチもとっています。
とかさらっと書いてあるだけで、具体的な記述はないんすよね (やっぱ入門書だな)。
でも言われてみれば、On-the-Fly 的に動的に DFA を構成して行けば、それで後方参照も
実現出来そうな気がしてきた。バックトラックとか面倒そうだけど一考の価値はあるかも
GNU grep もそうやって実装してる ? かどうかは分からないけど
284デフォルトの名無しさん
2025/11/05(水) 01:01:25.63ID:hq1L/1I1 それわかったらなんか良いことあるの(クルクルパー
285デフォルトの名無しさん
2025/11/07(金) 00:31:17.29ID:Ua2fzQVD NFA使わずに正規表現から直接DFAを構成する方法がDragon Bookに書いてあるけど
この書籍は今もDragon Bookで通じるのかな
もう古文書扱いされてそう
この書籍は今もDragon Bookで通じるのかな
もう古文書扱いされてそう
286デフォルトの名無しさん
2025/11/07(金) 17:38:51.77ID:2v77MqUc287デフォルトの名無しさん
2025/11/07(金) 18:36:08.56ID:Ua2fzQVD Dragon Bookでpdf検索すると大学のサイトとかで英語版が引っ掛かるけど旧版はセーフなのかな
DFAの構成法は第2版だと3.9節
少なくとも3章は最初から読んだ方がいいと思う
コンパイラに興味ないなら全部読む必要はない
DFAの構成法は第2版だと3.9節
少なくとも3章は最初から読んだ方がいいと思う
コンパイラに興味ないなら全部読む必要はない
288デフォルトの名無しさん
2025/11/07(金) 19:00:36.04ID:Ua2fzQVD そういえば正規表現自体の解析で4章前半のTop-Down Parsingくらいまでは役に立つかも
289デフォルトの名無しさん
2025/11/07(金) 20:27:12.90ID:2v77MqUc >>287
ありがとうございます。旧版 (日本語訳) はT、U共にさっき中古をポチりました
届くのは来週末だけど、図書館に第二版があるようなので明日行ってきます
コンパイラに興味ない、とまでは言わないけど、果たしてそこまで手を広げられるものなのか心許ないす
ありがとうございます。旧版 (日本語訳) はT、U共にさっき中古をポチりました
届くのは来週末だけど、図書館に第二版があるようなので明日行ってきます
コンパイラに興味ない、とまでは言わないけど、果たしてそこまで手を広げられるものなのか心許ないす
290デフォルトの名無しさん
2025/11/11(火) 08:03:53.83ID:TgiPYl91 こういう方に最新版をポンと出す制度にならんもんかな
291デフォルトの名無しさん
2025/11/11(火) 14:34:01.30ID:XyI6oP+4 複数の正規表現を使い分けられる記法があるといい
292デフォルトの名無しさん
2025/11/20(木) 00:34:25.20ID:mbRrNt6G DragonBook (第2版) の第3章まで読んだら、>>280 に書いた ε-遷移についての最初の疑問も氷解してしまったので、
一応伏線回収しておきます
「正規表現技術入門」では、ε-遷移を除去した後で部分集合構成法を行う、という流れで記述されていたので、
部分集合構成法を行うには前もって ε-遷移を除去しなければならない、と思い込んでいたのだけど、
その必要は全くなかったのでした
部分集合構成法の処理の中で一つ部分集合が得られたら、その集合の ε-閉包を取って
(その集合に そこから ε-遷移する状態を全て加えて)、それを DFA の 1 状態とすればよいだけなのでした
>>283 に書いた AI の回答が何となく歯切れが悪かった理由もこれで納得出来たわけで、
何でこんな簡単なことを思い付かなかったのか、我ながらアホでしたね
「正規表現技術入門」は章ごとに執筆者が違っていて、VM 型エンジンの章は鬼雲の作者が直々に書いていて説得力があるのですが、
DFA 型エンジンの章、とくにこの ε-遷移あたりの記述は今一つな感じです (エラそうに言ってますが)
--
ところで DragonBook 3.9 節の「正規表現から直接 DFA を導くやり方」も読みました
シンプソン構成法を経由せず、構文木から DFA を導くのはスゲーと思ったのですが
followpos() の張るダイアグラムは一種の NFA 的なものなので、それを DFA に変換する時には
やはり部分集合構成法と同じ手法を使うわけですね
とは言え ε-遷移が存在しないので扱う状態数もずっと少なくて済むはずなので、
これを使って On-the-Fly 法を実装して行きたいと思ってます
何にせよ、DragonBook を読めと言ってくれた >>285 さんには感謝しかないです
ありがとうございました
一応伏線回収しておきます
「正規表現技術入門」では、ε-遷移を除去した後で部分集合構成法を行う、という流れで記述されていたので、
部分集合構成法を行うには前もって ε-遷移を除去しなければならない、と思い込んでいたのだけど、
その必要は全くなかったのでした
部分集合構成法の処理の中で一つ部分集合が得られたら、その集合の ε-閉包を取って
(その集合に そこから ε-遷移する状態を全て加えて)、それを DFA の 1 状態とすればよいだけなのでした
>>283 に書いた AI の回答が何となく歯切れが悪かった理由もこれで納得出来たわけで、
何でこんな簡単なことを思い付かなかったのか、我ながらアホでしたね
「正規表現技術入門」は章ごとに執筆者が違っていて、VM 型エンジンの章は鬼雲の作者が直々に書いていて説得力があるのですが、
DFA 型エンジンの章、とくにこの ε-遷移あたりの記述は今一つな感じです (エラそうに言ってますが)
--
ところで DragonBook 3.9 節の「正規表現から直接 DFA を導くやり方」も読みました
シンプソン構成法を経由せず、構文木から DFA を導くのはスゲーと思ったのですが
followpos() の張るダイアグラムは一種の NFA 的なものなので、それを DFA に変換する時には
やはり部分集合構成法と同じ手法を使うわけですね
とは言え ε-遷移が存在しないので扱う状態数もずっと少なくて済むはずなので、
これを使って On-the-Fly 法を実装して行きたいと思ってます
何にせよ、DragonBook を読めと言ってくれた >>285 さんには感謝しかないです
ありがとうございました
293デフォルトの名無しさん
2025/11/20(木) 01:53:23.80ID:MRBYucy1 ●Regular Expressionの使用環境
Java1.5
●検索か置換か?
検索
●説明
http://とhttps://があるもしくはない場合のドメインとサブドメインを検索したい
自分で考えた以下の正規表現だと、.から始まる不正なURLまで一致してしまいダメでした
^(https?://)?(.*\.)?doubleclick.net
●対象データ
#一致させたいものは以下
http://doubleclick.net/pagead/
https://doubleclick.net/pagead/
http://g.doubleclick.net/pagead/
https://g.doubleclick.net/pagead/
http://googleads.g.doubleclick.net/pagead/
https://googleads.g.doubleclick.net/pagead/
doubleclick.net/pagead/
g.doubleclick.net/pagead/
googleads.g.doubleclick.net/pagead/
#一致させたくないものは以下
http://.doubleclick.net/pagead/
https://.doubleclick.net/pagead/
http://.g.doubleclick.net/pagead/
https://.g.doubleclick.net/pagead/
http://.a.g.doubleclick.net/pagead/
https://.a.g.doubleclick.net/pagead/
.doubleclick.net/pagead/
.g.doubleclick.net/pagead/
0doubleclick.net/pagead/
http://0doubleclick.net/pagead/
https://0doubleclick.net/pagead/
Java1.5
●検索か置換か?
検索
●説明
http://とhttps://があるもしくはない場合のドメインとサブドメインを検索したい
自分で考えた以下の正規表現だと、.から始まる不正なURLまで一致してしまいダメでした
^(https?://)?(.*\.)?doubleclick.net
●対象データ
#一致させたいものは以下
http://doubleclick.net/pagead/
https://doubleclick.net/pagead/
http://g.doubleclick.net/pagead/
https://g.doubleclick.net/pagead/
http://googleads.g.doubleclick.net/pagead/
https://googleads.g.doubleclick.net/pagead/
doubleclick.net/pagead/
g.doubleclick.net/pagead/
googleads.g.doubleclick.net/pagead/
#一致させたくないものは以下
http://.doubleclick.net/pagead/
https://.doubleclick.net/pagead/
http://.g.doubleclick.net/pagead/
https://.g.doubleclick.net/pagead/
http://.a.g.doubleclick.net/pagead/
https://.a.g.doubleclick.net/pagead/
.doubleclick.net/pagead/
.g.doubleclick.net/pagead/
0doubleclick.net/pagead/
http://0doubleclick.net/pagead/
https://0doubleclick.net/pagead/
294デフォルトの名無しさん
2025/11/20(木) 09:40:15.39ID:Mz3QCXK6 その処理系で文字クラスが使えるなら (.*\.)? を ([^.0].*\.)? とすればイケるハズ
295293
2025/11/20(木) 15:17:38.43ID:MRBYucy1 >>294
レスありがとうございます
以下の2行は一致しなくなりましたが、
.doubleclick.net/pagead/
.g.doubleclick.net/pagead/
以下の6行は一致してしまいました
http://.doubleclick.net/pagead/
https://.doubleclick.net/pagead/
http://.g.doubleclick.net/pagead/
https://.g.doubleclick.net/pagead/
http://.a.g.doubleclick.net/pagead/
https://.a.g.doubleclick.net/pagead/
レスありがとうございます
以下の2行は一致しなくなりましたが、
.doubleclick.net/pagead/
.g.doubleclick.net/pagead/
以下の6行は一致してしまいました
http://.doubleclick.net/pagead/
https://.doubleclick.net/pagead/
http://.g.doubleclick.net/pagead/
https://.g.doubleclick.net/pagead/
http://.a.g.doubleclick.net/pagead/
https://.a.g.doubleclick.net/pagead/
296デフォルトの名無しさん
2025/11/20(木) 16:30:51.92ID:0pUMlwmF "doubleclick.net"は決め打ちでいいのかな
Pattern p = Pattern.compile("^(?:https?://)?((?:[^./?#]+\\.)*doubleclick\\.net)(?=[:/]|$)");
マッチした後の処理は分からんけど動作例
https://ideone.com/3WFyH6
Pattern p = Pattern.compile("^(?:https?://)?((?:[^./?#]+\\.)*doubleclick\\.net)(?=[:/]|$)");
マッチした後の処理は分からんけど動作例
https://ideone.com/3WFyH6
297293
2025/11/20(木) 21:15:50.67ID:MRBYucy1 >>296
レスありがとうございます
せっかく教えていただいたのにすみません、JavaではなくてJavaScriptでしたので動作しませんでした
チェッカー
https://www-creators.com/tool/regex-checker
レスありがとうございます
せっかく教えていただいたのにすみません、JavaではなくてJavaScriptでしたので動作しませんでした
チェッカー
https://www-creators.com/tool/regex-checker
298デフォルトの名無しさん
2025/11/20(木) 21:32:25.61ID:0pUMlwmF 今時分にJava1.5でおかしいと思ったけどスルーしてしまった
文字列でエスケープしてる\\を\に直せば使えるはず
ついでに?と#を先読みに追加した(多分いらない)
^(?:https?://)?((?:[^./?#]+\.)*doubleclick\.net)(?=[:/?#]|$)
文字列でエスケープしてる\\を\に直せば使えるはず
ついでに?と#を先読みに追加した(多分いらない)
^(?:https?://)?((?:[^./?#]+\.)*doubleclick\.net)(?=[:/?#]|$)
299293
2025/11/20(木) 21:52:35.87ID:MRBYucy1300デフォルトの名無しさん
2025/11/20(木) 23:34:16.70ID:mbRrNt6Gレスを投稿する
ニュース
- 中国「国連安保理の許可なしに日本攻撃可能」 Xで旧敵国条項に言及… ★9 [BFU★]
- 【赤坂ライブハウス刺傷】逃走していた自衛官の男(43)を殺人未遂の疑いで逮捕 警視庁 被害女性とは知人関係 [Ailuropoda melanoleuca★]
- 【千葉】コンビニに尿入りペットボトル並べた疑い、26歳男「むしゃくしゃして」…購入した客が飲もうとしたところ臭いに違和感 [ぐれ★]
- 中国官製報道「日本経済はもう持たない」にネット民ツッコミ「ニュースだけ見てたら日本はもう百回くらい爆発してる」 [1ゲットロボ★]
- 植田日銀総裁 「円安進行が物価高を起こしている」 ★4 [お断り★]
- 【STARTO ENTERTAINMENT】timelesz、メンバーの不適切言動を謝罪「不用意かつモラルに反した発言であった」 全員の署名入りでコメント [Ailuropoda melanoleuca★]
- 【ガチ正論】一般人「中国に規制制裁されて、『中国ムカつく』じゃなくて矛先が『許さんぞ高市』になってる奴、頭おかしいの?」 ★2 [153490809]
- VIPってこんなに人少なかったっけ?
- 【ぺこ専🐰】なんG 兎田ぺこら突発配信実況スレ🏡【ホロライブ▶】
- お前らチンポ出せよ!!
- NHKニュースウオッチ9「日本側は対話にオープンな姿勢で安定した日中関係を築きたい考えなのに中国が意固地で糸口が見いだせない」 [904151406]
- 日中戦争起きたら5日で自衛隊壊滅するらしい。じゃあ徴兵も無いし、俺等が必死になって反対してやる理由なくね? [237216734]
