(7046)
7046:
vwxの苦悩
投稿者:
文太
2016/01/11(月) 12:22
コメント数 1
詰められないし、そんなに詰める意味ある? という気がしてきてしまいまし
たので、中途半端に上げてしまいます。
「正規表現」というのは、元来行志向なものです。そして、最差最長のような
(古典的な)ルールのように行頭から行末に向かって「考える」ように設計・発
想されていると思います。
というわけで、 Vz+vwx での下から上に向かっての処理、同じ組み合わせでの
「backward」(ここから上、つまりファイル先頭に向けて)の置換につらいもの
が出てくるのは、仕方ないことなのでしょう。もっとも、考えてみれば、僕はこ
れをほとんどしないので、ま、いっかと投げちゃうことにした次第ですが。もち
ろん、ファイル先頭行の処理のため、検索をつかう切った貼ったマクロでは、
ファイル最初の行は行末から行頭へ検索する、というのも確立した技術ですが
(個人的には、やばい場合はなさそうと判断)。
さらに、 「もっとも」「でも」をくり返せば、僕がみたところ、これ、Win9x
とか NT 系とか vtdos とかのプラットフィームと関係のない不具合、つまり Vz+
vwx が生まれつき持っていた不具合で、我々は(少なくとも僕は)20年以上、
このような vwx の振る舞いに気づかないまま平気でやってきたのですから、大
事(おおごと)ではありません。
とにかく、以下の下からの検索(#r)では、不具合が露呈します。 「$」も絡
んでますね。
4行目(くらい)は、テスト用の対象文字列のつもりです。5行目(くらい)
にカーソルを置いてテストすることを想定しています。
;あら、改行文字にヒットしちゃう。vwx正規表現は「改行文字」を無視する仕様
;なので、これはいけない。重くないと思うけど。
A \x .
B \x [^あい]
う
;1つ下の行からだと改行文字の次の(前の)ターゲットにヒットしない。
C \x \.$ ;1文字。メタキャラの否定。「^」だと上下とも問題なし
D \x \. ;$なしだとヒット
.
;1文字(A, B)のときだけなのか? →とは限らない。
A' \x .あ$ ;1行下からダメ 「$」に問題があるように思える。→改行の処理?
.あ
いあ
A' \x あ.$ ;1行下からダメ
あ.
あい
;1つ下の行からだと改行文字の次の(前の)ターゲットにヒットしない。
C' \x あ\.$ ;メタキャラの否定。2文字。ダメ。
あ.
C" \x \.あ$ ;メタキャラの否定。2文字。ダメ。
.あ
上が読み解けて、バババと連続でテストした方は唖然とするというか暗い気持
ちになるかもしれませんが、これだけの条件を整えるのは大変で、つまり、あま
り普通は起こりませんからご安心を。
うまく咀嚼、消化できたわけではないのですが、10# さんが vtdos 掲示板
BBSで「1文字短く認識されてるよう」(2015/12/29 (Tue) 18:31:53)と言っ
ていたことが、「改行文字」(0d0ah の2文字)あたりと絡んでるかな、とか空
想しました。「0d0ah の2文字」の2文字だから逆に、、、とか。
余計であてにならない妄想:正規表現が元来行志向だとすれば、 #r を含むエ
ディタに装着される vwx は、エンジンからして当時のやり方よりずっと進化し
ていなければならなかったのかな、などと考えました。秀丸(正規表現+ #r が
ちゃんと効く)には、hmjre.dll(秀丸 Japanese Regex)というエンジンがあっ
て、進化エンジンを秀丸用にしたもののはずです。進化系では最左最長の原理を
修正する greedy, reluctant, possessive の3段階になっています。起点を左に
ずらす機能と僕はイメージしています。「改行2文字」と「$」とは、ちょっと
違う話かな、とも思ってますが。
ですから、上は「不具合」というより(ユーザの直感からは外れますが)、仕
方のない「仕様」となるのかな、とも思っています。Looks like a bug, but it's
a feature とか。仕様でもバグでも、我々としては「振る舞いを読み切る」あ
るいは「天使が恐れるところには近づかない」ぐらいしか手がないのですが。
詰めたい方は詰めて下さい。「$」「改行文字」「1行下」「#r」あたりが
キーワードみたい。「*」「?」「+」あたりの Quantifier は、みなそうなりそうな
気がする。
文太君、おしかったねぇ、もう少しだったよぉ、とか誰か言ってくれないかなぁ。
追伸:下も同根なのかな? ちょっと違うかな。これは、いつもすごく不満。
何とかならんのかな、と思って、はや20年。
「\x $」→「b」(行ブロック指定。置換。これはバグです)
aaa
aaa
「\n」→「b\n」とすればいい、
では解決しない場合がいっぱいあるんですよ。
- No.7046 -
このTreeへ
[リストへもどる]
pre
(7046)
7048:
Re: vwxの苦悩
投稿者:
10♯
2016/01/11(月) 20:35
7046 番 文太 さんへのコメント コメント数 1
僕の感覚ではソフトはたまに部屋でお漏らししたりコンセントにおしっこかけてしまう
猫みたいなもんですわ。
そんなソフトでも必要とするのは何故かというと、
まさに猫の手も借りたいから(^^;)
- No.7048 -
このTreeへ
コメント元:7046 へ
[リストへもどる]
soft
(7046)
7049:
Re^2: vwxの苦悩
投稿者:
文太
2016/01/12(火) 00:18
7048 番 10♯ さんへのコメント コメント数 1
vwx調査つづき
確認です。
以下、4つのレコードがあると考えてください。
検索文字列と対象文字列の2行で1ペア。
レコードを区切る空行にカーソルを置いて#rする。
\x あ. ;A
あい あい あい
\x ^あ. ;B
あい あい あい
\x あ.$ ;C 失敗
あい あい あい
\x あ.$ ;D
あい あい あ
A ちゃんと後ろから(3つ目の「あい」から)ヒットしてゆく。
行志向といっても、行頭からマッチングが試みられるわけではない。
B 問題なし。
C Bのレコードに当たってるでしょ。
D 対象文字列行末で「い」が削除されていて、「\x あ.$」の「.」にヒットする
ものがないので、Cのレコードにヒットで正解。
ここが確認したかったこと。うん、もし「.」が改行文字にヒットすると
(そんな事例がありました)Dの「あ改行」にヒットしてしまうのか、と思ったのです。
「$」の意味はどうなるんじゃい? と思っていた。不安だった。
「前行にヒットしない」ではなく、「改行文字にヒットしてしまう」現象は、
やはり検索文字列が1文字のときみたい。
苦闘はなおも続く。フォーマット、基本的に同じ。
\x あ[^い]$ ;E ヒットなし、正解。
あい あい あ
\x あ[^い]$ ;F ヒット。正解。
あい あい あう
\x あ\.$ ;G おお、一歩前進。行末「あ.」にヒットせず困って
;しまうのは、カーソルが「あ.改行★」の、★の位置に
;あるときです。色々納得。
;左下のサンプルでは、次行の行頭「か」にカーソルを置くと
;ヒットしないが、次の「き」ではヒットします。
あい あい あ.
かき
\x . ;H 検索で改行文字にヒット。ダメ。
あい あい あう
「改行文字にヒットしてしまう」ような不具合は、もうちょっとちゃんと調べ
ないと深刻かな、と思ったのでした。「.」「[^あ]」(※)みたいな検索文字列
が1文字になる指定をして上に向かって検索すると(#r)、痛い目にあいます。
僕がみたところ、置換は大丈夫みたいでした。
脱線から結論へ。
(※)「.」や「[^あ]」は、正規表現として不正ではありません。
以下は、sed(serow版にあらず)でしたテスト。
s/./★/4 ;スクリプト
あああああ ;入力
あああ★あ ;出力
s/[^あ]/★/4 ;スクリプト
かかかかか ;入力
かかか★か ;出力
スクリプト末の「4」は4番目の意味。(serow 版ではこの番号フラグ不可。)
ただ、Vzは、s///g のグローバルフラグを立てた状態と同じく、グローバル
に検索・置換しますので、「.」「[^あ]」のような指定は、あまり現実的では
ありません。 「+」「*」「?」のような装飾子と同じ役割を通常果たすものだ
ろうと考えてもいい。ちょっと甘いけど。というわけで、「改行文字」にヒット
するという最悪の事態は通常避けられている、ということだと思います。
別の現象、改行をまたいだ前行末は危ない。これは起こるときには起こるでし
ょう。でも、直前、目前だけです。そんな場所から検索を始めないことです。
置換については、どうも大丈夫そうだ、という感触ですが、、、。
\x あいうえ[^お]$ ;「か」で失敗。「き」で成功。マッチングは「あ」からなのに。
あいうえあ
かき
最後に回数指定子ふたたび。ほぼ検算。あるいは練習問題。
始点、カーソル位置はよく考えましょう。
ヒント:ここに改行入れれば当たるね、と発想できると合格。
\x あい*$
あ
あい
あいい
対象文字列が3行あります。順番にやってみてください。なるほど、と
思うはずです。もちろんバグ入りです。
\x あい?$
あいい
あい
あ
上に同じです。別に僕がトリックを仕掛けているのではありません。
vwxによる正規表現講座では、ぜったい下からの検索は避けるべきです。
\x あ+$
あい
あ
ああ
同じ。ただ、わざと地雷を踏むようにしてるだけですよ。
上への検索、直前の改行文字、1文字の指定。
気をつけるべきはこんなところでしょう。
猫とはいえ、いつ、どこにおしっこをするのかという習性ぐらいは把握しておか
ないと、むしゃくしゃしたときなどに、殺猫(さつねこ)したり自殺したくなったり
します。それは困ります。
vwxと猫はある程度予想可能ですが、人間なんて何をしでかすか分かったものじゃ
ありません。(^^)v
- No.7049 -
このTreeへ
コメント元:7048 へ
[リストへもどる]
pre
(7046)
7050:
Re^3: vwxの苦悩
投稿者:
konno
2016/01/12(火) 01:01
7049 番 文太 さんへのコメント コメント数 1
文太さん
結構色々あるんですね。
外しているかもしれませんが、VWXが行単位で検索しているとすれば、
この現象は検索文字が1文字の時など特定の条件で、改行で一時停止するとか、
行の終わりで止まってしまうというバグがあるような気がしますね。
ソースがあればあたりをつけられる可能性もあるかもですが
私のスキルでは直すのは無理でしょうね。正規表現を知らないので。
VWXT は文字列検索らしいですが、この間試したら、倍ぐらい遅いですね。
猫も一匹二匹ならかわいいものですが、多すぎると手に負えなくなるものです。
なんの話だ?
- No.7050 -
このTreeへ
コメント元:7049 へ
[リストへもどる]
soft
(7046)
7054:
Re^4: vwxの苦悩
投稿者:
文太
2016/01/12(火) 13:35
7050 番 konno さんへのコメント コメント数 1
konnoさん
>外しているかもしれませんが、VWXが行単位で検索しているとすれば、
>この現象は検索文字が1文字の時など特定の条件で、改行で一時停止するとか、
>行の終わりで止まってしまうというバグがあるような気がしますね。
「VWX が行単位で検索」。 「&」では間違いありません。そういう仕様のはず
です。前のくり返しですが、そんな仕様の演算子は「正規表現」にはないのです
が。wgrep 由来。グレップだって、これはオプションで可能にしている機能であ
って、正規表現の中には存在しないんです。ま、区別がそれほど明瞭でない、な
く見える場合も多いように思うのですが。
「|」も行単位。仕様からして。奇妙な仕様だけど。
ただ、その後サンプルで示したように、vwx が完全に「行単位」で考えていた
ら、これが実現できているはずはない、ということもあります。
また「エンジンが古すぎで無理だった」みたいな書き方もしてますが、そうで
もなかろう、これができてるのだから、というのもありました。
何を言っているのかぜんぜん分からないみたいですが、 僕は vwx が Vz に渡
している情報(一致長や起点・終点)が間違ってるのじゃないかと空想していま
す。改行文字へのヒットは、完全なバグでしょうけど。
じつに意味のない発言ですいません。
>VWXT は文字列検索らしいですが、この間試したら、倍ぐらい遅いですね。
エンジンが違うとは聞いています。ただ、vwx が「行検索」だ、と言ったら、
それは誇張です。僕の言い方に足を取られていますのでご注意ください。そうい
う misleading な書き方を少ししてしまったので。
vwx の機能が全部実現できていたら、vwxt の倍の遅さにも僕はじゅうぶん我
慢できるのですが、その確認のための膨大な手間が、やる気をそいでます。
また、どうしても vwx で足りないところは、外部アプリ(yagrep, onigsed)
に出動願ってますし。
>猫も一匹二匹ならかわいいものですが、多すぎると手に負えなくなるものです。
僕の場合、vwx一匹なのですが、、、。
とはいえ、 今回の発見は実際的には瑣末な事柄です。vtdos とのかね合いで
「+」が機能したから、とりあえず「やった!」という感じでいます。あと一点、
vwx で確認しておくべきことを、今朝思いついてしまった。やれやれ。
- No.7054 -
このTreeへ
コメント元:7050 へ
[リストへもどる]
soft
(7046)
7055:
Re^5: vwxの苦悩
投稿者:
文太
2016/01/12(火) 13:54
7054 番 文太 さんへのコメント
全角半角同一視
これにもvwxは使われています。あまり使わないからちょっと不安でしたが。
例によって、対象文字列の下の行(4行目)から上へ検索してみてください。
「\z」というより「\x」に引っかかってますね。
\z A
\xz A$
AA
こちらは改行文字にはヒットしません。よかった、よかった。
\z .
.
.
「\z」に問題はなく、「\x」にだけ問題があります。
- No.7055 -
このTreeへ
コメント元:7054 へ
[リストへもどる]
soft