[過去ログ] Regular Expression(正規表現) Part16 (1002レス)
前次1-
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
47
(1): 29 [sage] 2021/11/25(木)18:40 ID:QsU6pq8j(1/2)
Onigmo のバグの原因となった個所が判明したので書いておこう

正規表現における非包含オペレータの提案
https://staff.aist.go.jp/tanaka-akira/pub/prosym49-akr-paper.pdf

この論文のサンプルコードに下記のメソッドがある

def try_alt(r1, r2, str, pos, &block)
try(r1, str, pos, &block)
try(r2, str, pos, &block)
end

これは正規表現で言うと r1|r2 の "|" にあたる動作をする部分のメソッドだが
このサンプルコードでは r1 のマッチが成功した後でも必ず r2 を試す仕様になっている

しかし Onigmo の検索方式では r1 がマッチした後に正規表現の最後までマッチが
成立した場合には r2 が試されない仕様になっている
これにより r2 を通る一部パターンが見落とされる結果となりバグとして出現した

論文中の非包含オペレータのメソッドである def try_absent(r, str, pos) は
上記の def try_alt を使う前提で書かれたものなのでこれをそのまま Onigmo には移植出来ない

サンプルコード方式での処理量を考えるとおそらくこれとはまったく別のアルゴリズムで動く
動作の軽いメソッドを自作しないと Onigmo には導入出来ないのではないだろうか..
48: 29 [sage] 2021/11/25(木)19:06 ID:QsU6pq8j(2/2)
論文3ページ目の右半分に 表3 がある

r1r2  |  [:seq, r1, r2]

ここの :seq は r1 と r2 を連接するという意味で使われているが
サンプルコードでは :seq を使わず :cat になっている
ここで疑問なのが何故違う名前を使うことになったのか? である

(仮説1) 非包含オペレータ提案者さんは猫が好き

ごろにゃんしながらバックトラックにゃん である

(仮説2) cat は Unix でよく使われる連結コマンドであり catenate から由来する

これもなかなかの難問である
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.040s