kmiya-culti / RLogin

RLoginは、Windows上で動作するターミナルソフトです
http://nanno.bf1.jp/softlib/man/rlogin/
MIT License
464 stars 16 forks source link

改行を含む正規表現について #65

Closed KenjiFuse closed 3 years ago

KenjiFuse commented 3 years ago

lsコマンド等の結果を表示した際に、改行を含む正規表現で文字列がマッチするかどうかを試しています。 【検索対象文字列】 .cache .aaaa .bbbb .profile .cccc 【正規表現】 cache[\s\S]*?profile

上記正規表現では「文字列を検索」でもregcharでもマッチしませんでした。 何かマッチする表現方法がございましたらご教授ください。 (RLogin(x64) Version 2.25.8)

kmiya-culti commented 3 years ago

正規表現のライブラリにいくつかのバグや仕様上の問題がありました。 まず、[]内でのエスケープ文字で\s\Sなどは、使用できません。 また、\000などの8進数表現も不定な文字になってました。

「文字列を検索」では、検索が一致してもさらに続く可能性がある場合は、検索を続けるようにしています。 [\s\S]*が無限に一致する可能性(profileの条件を含む)があるので結果的に一致しないように動作しているようです。 この部分については、仕様変更を考えたほうがよさそうです。

長いこと放置してあったライブラリなので見直した方がよさそうですね。

KenjiFuse commented 3 years ago

ご確認頂きありがとうございます。 最近TeraTermから乗り換えたばかりでまだ使いこなせていない状況ですが、画面読み出しのcgetc()→regchar()の機能が非常にインパクトがあり、受信メッセージの自動検出に使用させて頂いております。 優れた機能だと思いますので、[\s\S]*が使用できるようになればさらに活用範囲が広がります。 大変恐縮ですが、仕様変更を期待しております。

kmiya-culti commented 3 years ago

いくつかの不都合や仕様を変更してみました。 お試しいただければ幸いです。

http://nanno.dip.jp/softlib/man/rlogin/regex.html http://nanno.dip.jp/softlib/rlogin/2.25.9/

KenjiFuse commented 3 years ago

早速ご対応頂きありがとうございます。 v2.25.9を試してみました。 「文字列の検索」では"cache[\s\S]profile"でマッチすることが確認できました。 但し、"?"とするとマッチしないようです。 また、スクリプトのregopen()→cgetc()で試してみましたがこちらは"?"無しでもマッチしませんでした。 [スクリプト] copen(); p = regopen(".cache[\s\S]*profile"); while ( (a = cgetc()) != EOF ) { if ( b = regchar(a, p) ) { msgdlg( "hit" ); } } regclose(p);

regopen()での対応は難しいでしょうか…。

kmiya-culti commented 3 years ago

正規表現ライブラリを見直して*?や+?などの最小一致などに対応してみました。

http://nanno.dip.jp/softlib/man/rlogin/regex.html

上記スクリプトですがスクリプト内で「\」を解釈しているので

p = regopen(".cache[\\s\\S]*profile");

にする必要があります。(ん?GitHubのエディタで消されたのかなぁ?)

KenjiFuse commented 3 years ago

ライブラリの見直しに対応頂きありがとうございました。 regopen()もご指定の記載とすることで、期待する結果となりました! 今後も活用させて頂きます。 →本件もCloseします。