HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
0406
kanamaruhspからjavascriptの実行12解決


kanamaru

リンク

2020/4/6(Mon) 13:47:26|NO.89973

別のスレッドで正規表現の.に\rが含まれる影響で
正規表現を用いた置換がうまくできない問題について、
vbscriptではなくjavascriptなら\rを含まないので
問題なく置換できるのではないかと考えて、
mod_regexp.asを実装しようとしているのですが、
改行が消える問題は同じく発生しました。
\rは含まないのにです。
オンラインのjavascriptで文字列置換を試せるサイトでは改行は消えません。
原因は何だと思いますか?
また、scriptcontrolで配列を受け取るにはどうすればいいですか?
(matchesの実装に使います)
以下に減少が確認できるプログラムを載せておきます。

#module #defcfunc jsrun str code,str func newcom objjs, "ScriptControl" objjs("Language")="javascript" objjs->"AddCode" code comres re objjs->"Run" func return re #defcfunc jsrun2 str code,str func,str p newcom objjs, "ScriptControl" objjs("Language")="javascript" objjs->"AddCode" code comres re objjs->"Run" func,p return re #defcfunc replace str target,str Pattern,str repstr,int IgnoreCase,int Global,int Multiline opt="" if(IgnoreCase=0):opt+="i" if(Global=0):opt+="g" if(Multiline=0):opt+="m" code={" function replace(str){ var pat=/"}+Pattern+{"/"}+opt+{"; var rstr=\""}+repstr+{"\"; return str.replace(pat,rstr) } "} return jsrun2(code,"replace",target) #global code = {" mes "1" mes "2" ; t mes "3" ; t mes "4" // t mes "5" // t "} ; コメント文を消去 code = replace(code,";.*", "") // セミコロン code = replace(code,"\\/\\/.*", "") // スラッシュx2 mesbox code,ginfo_winx,ginfo_winy,5



この記事に返信する


kaki

リンク

2020/4/6(Mon) 22:28:02|NO.89976

JavascriptとJScriptの非互換な部分ではないでしょうか。
リファレンスを見る限り、VBScriptにしてもJScriptにしても'.'パターンはCRを含むのではないかと思います。
https://docs.microsoft.com/ja-jp/previous-versions/windows/scripting/cc392020(v=msdn.10)

Active Scriptingは詳しくないのですが、VBScriptとJScriptでRegExpは同じ実装なのでは…



kanamaru

リンク

2020/4/6(Mon) 22:54:16|NO.89981

JScipt…。せめてもう少し本家と互換持ってくれ。
いい発想だと思ったけど、結局ダメか。
・一行ごとに処理してつなげる
・IEコンポーネントでjavascript呼ぶ
・自力でパーサを書く
どれがいいと思いますか?



X

リンク

2020/4/6(Mon) 23:23:27|NO.89983

試してませんがBREGEXP.DLLではダメなのでしょうか?
確かいくつかモジュールを公開されている方がいらっしゃったように思います。
またモジュール内での呼び出しDLLをbregonig.dllに変えればそのまま互換で使えたように記憶しています。



kanamaru

リンク

2020/4/7(Tue) 07:50:30|NO.89985

BREGEXP.DLLを試してみようとしたのですが、
なんかプログラムが強制終了するんですが。
なぜ?サンプルは動くのに。
一応実行したプログラムは以下です。

#include "gm_bregexp_dll.hsp" code = {" mes "1" mes "2" ; t mes "3" ; t mes "4" // t mes "5" // t "} mes "[brex_subst]" brex_subst "/;.*/", code, text ret = stat switch ret case BREGEXP_ERROR@bregexp_dll mes "p1,p2いずれかの内容が不正です。" swbreak case 0 mes "置換できる文字列はありませんでした。" swbreak default mes "cnt: " + ret mes "result: \"" + substtext + "\"" swend //mesbox text,ginfo_winx,ginfo_winy,5
http://lldev.jp/hsp/module/bregexp_dll.html
のモジュールを使わせてもらいました。
強制終了する原因はわかりますか?



kanamaru

リンク

2020/4/7(Tue) 10:32:37|NO.89986

ネットで調べたら標準命令のみで実装されている正規表現モジュールが
公開されていたので、
そのモジュールをラップして
mod_regexp.asと同じように動作するようにして見たいと思います。
そのモジュールは引数が多くて使いづらいと思うので。
(matchesとsubmatchを一つの命令に押し込んだような命令なので)
この方法ならhsp3dishでも使えます。
さすがに自力でパースは大変だと思っていたので助かりました。



vof

リンク

2020/4/7(Tue) 10:57:42|NO.89987

ドット一つにそこまでこだわる必要ありますか。
ドットの代わりに[^\r\n]をつかうとか、前処理で一度CRLFをLFにしてから置換するとかで十分では。



kanamaru

リンク

2020/4/7(Tue) 11:12:00|NO.89988

わかっている人ならそれでいいかもしれませんが、
わかってない人が困るんじゃないかと思います。
まあマニュアルに書いてあるようですが、
果たしてマニュアルをきちんと読む人がどれだけいるのやら
実際これが原因で悩んでる人がいましたし。
ちなみに僕はマニュアルよりサンプル見ることが多いです。
後、前処理で一度CRLFをLFにしてから置換するのは試したけど
うまくいきませんでした。



vof

リンク

2020/4/7(Tue) 12:00:12|NO.89989

まああなたのこだわりを否定したいわけではないので。
>後、前処理で一度CRLFをLFにしてから置換するのは試したけどうまくいきませんでした。
こんな感じでしょうか。

#include "mod_regexp.as" code = {" mes "1" mes "2" ; t mes "3" ; t mes "4" // t mes "5" // t "} lf="":wpoke lf,0,10 ; コメント文を消去 code= replace(replace(replace(code,"\n",lf),";.*", ""),"\\n","\n") code= replace(replace(replace(code,"\n",lf),"//.*", ""),"\\n","\n") mesbox code,ginfo_winx,ginfo_winy,5



X

リンク

2020/4/7(Tue) 19:07:04|NO.89996

こんばんは。
BREGEXPなのですがまずこちらから
http://k-takata.o.oo7.jp/mysoft/bregonig.html#SCT-4.1
最新版をダウンロードされてください。
またつーさ様のHPにてBREGEXP.hspというモジュールをダウンロードされてください。
https://tu3.jp/0360

#uselib "BREGEXP.DLL"


#uselib "bregonig.dll"
と変更した後


#include "BREGEXP.hsp" code = {" mes "1" mes "2" ; t mes "3" ; t mes "4" // t mes "5" // t "} mes "[BSubst]" BSubst code, "s#(;|//).*# #[m][g][R]" ret = stat switch ret case BREGEXP_ERROR@bregexp_dll mes "p1,p2いずれかの内容が不正です。" swbreak case 0 mes "置換できる文字列はありませんでした。" swbreak default mes "cnt: " + ret swend mesbox code,ginfo_winx,ginfo_winy,5
こんな感じでどうでしょうか。
BREGEXP.DLL本家HPにパターン文字に"/"を含む場合は〜、と説明があり"#"を使用しております。



kanamaru

リンク

2020/4/7(Tue) 19:27:10|NO.89997

ありがとうございます。
実行確認出来ました。
分割もできることを考えると
むしろこっちの方が便利かもしれません。
ということでこのDLLって再配布ってできるやつですか?
hspに付属してほしい。
DLLだからたぶん処理速いし。
hsp3dishで使えないのは本家と同じだし。



X

リンク

2020/4/7(Tue) 20:02:17|NO.89998

上記HPに

9. ライセンス
再配布などの際には、BSD ライセンスに従い、bsd_license.txt も同梱してください。
(ドキュメントに bsd_license.txt の内容を転記でも可)
とあるので、そこさえ注意すればkanamaru様が同梱して配布することは問題はないかと思います。

おにたま様がHSPに同梱、もしくは標準命令として取り込むのは
作者様同士でのやり取りになるため何とも言えませんがそうなれば夢のある話ですね。



kanamaru

リンク

2020/4/8(Wed) 16:08:49|NO.90001

bregonig.dllは便利だとは思うのですが、
僕としては、そもそもこのスレッドの話が出てきた理由を考えると、
hspに付属できたら望ましいですが、付属できるかわかりません。
そこで、(なんか暴走している気がしますが)
じゃあhspに付属させることを前提としたdll作っちゃえと考えました。
なのでこのスレッドは終わらせます。
早速作った中で問題が発生しているので別スレッドを作ります。



ONION software Copyright 1997-2023(c) All rights reserved.