里々で正規表現を使ってさくらスクリプトを消去する
2007.02.17
CMNユーザコミュのログ取り機能で使っています。
現行版ではssuのeraseで、それっぽい半角英数を消すというとても適当な方法でやっていましたが、それだと会話中の日付などの数字まで消えちゃうし辞書の見た目もずらずらと何行も費やして汚いので、今いじってる新版では正規表現を使う事に。
正規表現については、浮子屋さんの「正規表現講座」が大変わかりやすかったです。
里々で正規表現を使うためには、RyuさんのSAORI「string.dll」が必要です。
同梱されている「bregexp.dll」と一緒にSAORIフォルダなりどこなりにぶち込んで、「satori_conf.txt」で定義。(定義するのは「string.dll」だけでよい)
@SAORI
string,saori/string.dll
こんな感じで。
各機能を頻繁に使うなら、ssu.dllのようにここで引数まで設定しても良いかも。
私は今のとこ「replace」と「get」しか使っていないので設定していませんが。
チェックしたい「元の文章」の中から、特定の文字(正規表現で書く)を「置き換えたい文字」に置き換えるには、「replace」を使います。
(string,replace,(元の文章),s/(正規表現)/(置き換えたい文字)/g)
となりますが、これで返ってくる結果は、「いくつ置き換えしたか」という数字だけで、勝手に元の文章を書き換えるところまではやってくれません。
置き換えて書き換えた後の文章を手に入れるには「get」を使い、
(string,get,0)
とやらなければいけないようです。
しかしひとつ問題が。置き換えるべき語が元の文章になく「replace」の結果が「0」だった場合、「get」では文章が手に入らないようです。
なので、「replace」の結果が「0」の場合は元の文章をそのまま返し、「replace」の結果が「0」じゃなければ書き換えた文章を返す、というようにします。
(if,(string,replace,(元の文章),s/(正規表現)/(別の文字)/g)==0,(元の文章),(string,get,0))
これで、無事置き換えた文章が返ってくる、はずです。
しかし、毎回こんな長い文を書くのはめんどくさいしややこしいので嫌です。
なので里々の内部関数「call」を使ってもう少し手抜きします。
@正規置換
(if,(string,replace,(A0),s/(A1)/(A2)/g)==0,(A0),(string,get,0))
こう定義しておいて、実際に書くときは
(call,正規置換,(元の文章),(正規表現),(置き換えたい文字))
と書けばOKです。定義名は「正規置換」じゃなくてもなんでもいいんですが。
が、まだ「call」という横文字が入っててめんどくさいです。
なので「replace.txt」に
(正規置換,【タブ】(call,正規置換,
と書いておきます。
すると実際に書くときには
(正規置換,(元の文章),(正規表現),(置き換えたい文字))
と書くだけで、置き換えた後の文章が帰ってきます。
元の文章を書き換えて保存してしまうなら
$元の文章【タブ】(正規置換,(元の文章),(正規表現),(置き換えたい文字))
と、こんな感じ。
CMNの場合、変数「トークログ」に入っているCMNのユーザコミュ返事からさくらスクリプトを消してしまいたいのです。
なので「元の文章」は「トークログ」、「置き換えたい文字」は無にしたいので何も書かない。
さくらスクリプトの正規表現は、正確を期そうとするとちょっと難しかったので浮子屋さんの正規表現講座のものを使わせて頂きます。
$トークログ【タブ】(正規置換,(トークログ),\\(\\|q\[.*?\]\[.*?\]|[!&8fijmpqsn]\[.*?\]|[-*+01456bcehntuvxz]|_[ablmsuvw]\[.*?\]|__(t|w\[.*?\])|_[!?+nqsV]|[wi][0-9]),,)
以上です。
どしろうとが手探りで適当にやってるので間違ってたらごめんなさい。もっと良い方法があったら是非教えて下さい。
現行版ではssuのeraseで、それっぽい半角英数を消すというとても適当な方法でやっていましたが、それだと会話中の日付などの数字まで消えちゃうし辞書の見た目もずらずらと何行も費やして汚いので、今いじってる新版では正規表現を使う事に。
正規表現については、浮子屋さんの「正規表現講座」が大変わかりやすかったです。
里々で正規表現を使うためには、RyuさんのSAORI「string.dll」が必要です。
同梱されている「bregexp.dll」と一緒にSAORIフォルダなりどこなりにぶち込んで、「satori_conf.txt」で定義。(定義するのは「string.dll」だけでよい)
@SAORI
string,saori/string.dll
こんな感じで。
各機能を頻繁に使うなら、ssu.dllのようにここで引数まで設定しても良いかも。
私は今のとこ「replace」と「get」しか使っていないので設定していませんが。
チェックしたい「元の文章」の中から、特定の文字(正規表現で書く)を「置き換えたい文字」に置き換えるには、「replace」を使います。
(string,replace,(元の文章),s/(正規表現)/(置き換えたい文字)/g)
となりますが、これで返ってくる結果は、「いくつ置き換えしたか」という数字だけで、勝手に元の文章を書き換えるところまではやってくれません。
置き換えて書き換えた後の文章を手に入れるには「get」を使い、
(string,get,0)
とやらなければいけないようです。
しかしひとつ問題が。置き換えるべき語が元の文章になく「replace」の結果が「0」だった場合、「get」では文章が手に入らないようです。
なので、「replace」の結果が「0」の場合は元の文章をそのまま返し、「replace」の結果が「0」じゃなければ書き換えた文章を返す、というようにします。
(if,(string,replace,(元の文章),s/(正規表現)/(別の文字)/g)==0,(元の文章),(string,get,0))
これで、無事置き換えた文章が返ってくる、はずです。
しかし、毎回こんな長い文を書くのはめんどくさいしややこしいので嫌です。
なので里々の内部関数「call」を使ってもう少し手抜きします。
@正規置換
(if,(string,replace,(A0),s/(A1)/(A2)/g)==0,(A0),(string,get,0))
こう定義しておいて、実際に書くときは
(call,正規置換,(元の文章),(正規表現),(置き換えたい文字))
と書けばOKです。定義名は「正規置換」じゃなくてもなんでもいいんですが。
が、まだ「call」という横文字が入っててめんどくさいです。
なので「replace.txt」に
(正規置換,【タブ】(call,正規置換,
と書いておきます。
すると実際に書くときには
(正規置換,(元の文章),(正規表現),(置き換えたい文字))
と書くだけで、置き換えた後の文章が帰ってきます。
元の文章を書き換えて保存してしまうなら
$元の文章【タブ】(正規置換,(元の文章),(正規表現),(置き換えたい文字))
と、こんな感じ。
CMNの場合、変数「トークログ」に入っているCMNのユーザコミュ返事からさくらスクリプトを消してしまいたいのです。
なので「元の文章」は「トークログ」、「置き換えたい文字」は無にしたいので何も書かない。
さくらスクリプトの正規表現は、正確を期そうとするとちょっと難しかったので浮子屋さんの正規表現講座のものを使わせて頂きます。
$トークログ【タブ】(正規置換,(トークログ),\\(\\|q\[.*?\]\[.*?\]|[!&8fijmpqsn]\[.*?\]|[-*+01456bcehntuvxz]|_[ablmsuvw]\[.*?\]|__(t|w\[.*?\])|_[!?+nqsV]|[wi][0-9]),,)
以上です。
どしろうとが手探りで適当にやってるので間違ってたらごめんなさい。もっと良い方法があったら是非教えて下さい。
Track Back


