hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。
Module/文字列の置換 - HSP開発wiki
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS

文字列の置換モジュール

モジュール

現在の最新バージョンは1.3です。

このモジュールは大きな文字列を扱うことを想定して、変数を大きめに確保します。 あらかじめ短い文字列しか扱わないことが分かっている場合、定数FIRST_SIZEおよびEXPAND_SIZEの値を小さめに変更することで、メモリを節約できます。

よりスマートな実装方法をお求めの方は、HSP3ラウンジにCOMを利用したモジュールが掲載されていますのでそちらをご覧ください。

ヘルプブラウザ用hsファイル:filereplace.hs

filereplace.hsp
Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
|
!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
|
|
|
-
|
|
|
|
|
!
 
 
 
 
 
 
// 置換モジュール (HSP開発Wiki) 2007/06/05      ver1.3
#module modReplace
// 【変数の説明】
//    var sTarget       置き換えしたい文字列型変数
//    str sBefore       検索する文字列が格納された変数
//    str sAfter        置換後の文字列が格納された変数
//    str sResult       一時的に置換結果を代入する変数
//    int iIndex        sResultの文字列の長さ
//    int iIns          instrの実行結果が格納される変数
//    int iStat         検索して見つかった文字列の数
//    int iNowSize      sResultとして確保されているメモリサイズ
//    int iTargetLen    sTargetの文字列の長さ(毎回調べるのは効率が悪い)
//    int iAfterLen     sAfterの文字列の長さ (      〃      )
//    int iBeforeLen    sBeforeの文字列の長さ(      〃      )
#const FIRST_SIZE       64000   // はじめに確保するsResultの長さ
#const EXPAND_SIZE      32000   // memexpand命令で拡張する長さの単位
 
// メモリ再確保の判断及び実行のための命令(モジュール内部で使用)
#deffunc _expand var sTarget, var iNowSize, int iIndex, int iPlusSize
    if (iNowSize <= iIndex + iPlusSize) {
        iNowSize += EXPAND_SIZE * (1 + iPlusSize / EXPAND_SIZE)
        memexpand sTarget, iNowSize
    }
    return
 
// 文字列内の対象文字列全てを置換する命令
#deffunc replace var sTarget, str sBefore, str sAfter, local sResult, local iIndex, local iIns, \
    local iStat, local iTargetLen, local iAfterLen, local iBeforeLen, local iNowSize
 
    sdim sResult, FIRST_SIZE
    iTargetLen = strlen(sTarget)
    iAfterLen  = strlen(sAfter)
    iBeforeLen = strlen(sBefore)
    iNowSize   = FIRST_SIZE
    iStat  = 0
    iIndex = 0
 
    repeat iTargetLen       // 検索・置換の開始
        iIns = instr(sTarget, cnt, sBefore)
        if (iIns < 0) {         // もう見つからないので、まだsResultに追加していない分を追加してbreak
            _expand sResult, iNowSize, iIndex, iTargetLen - cnt // オーバーフローを避けるため、メモリを再確保
            poke sResult, iIndex, strmid(sTarget, cnt, iTargetLen - cnt)
            iIndex += iTargetLen - cnt
            break
        } else {                // 見つかったので、置換して続行
            _expand sResult, iNowSize, iIndex, iIns + iAfterLen // オーバーフローを避けるため、メモリを再確保
            poke sResult, iIndex, strmid(sTarget, cnt, iIns) + sAfter
            iIndex += iIns + iAfterLen
            iStat++
            continue cnt + iIns + iBeforeLen
        }
    loop
 
    sdim sTarget, iIndex + 1
    memcpy sTarget, sResult, iIndex
    return iStat            // おまけ。置換した個数をシステム変数statに代入。
#global
v1.0 -> v1.1
長い文字列を扱ったときのパフォーマンスを向上(参考:HSP3ラウンジ
v1.1 -> v1.2
バッファオーバーフローへの対処を追加
v1.2 -> v1.3
引数sTargetのサイズを必要最小限に変更

サンプル

filesample.hsp
Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 
 
 
 
 
 
 
-
|
|
!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
|
|
|
-
|
|
|
|
|
!
 
 
 
 
 
 
 
 
 
 
 
 
// 置換モジュール (HSP開発Wiki) 2007/06/05      ver1.3
#module modReplace
#const FIRST_SIZE       64000   // はじめに確保するsResultの長さ
#const EXPAND_SIZE      32000   // memexpand命令で拡張する長さの単位
 
// メモリ再確保の判断及び実行のための命令(モジュール内部で使用)
#deffunc _expand var sTarget, var iNowSize, int iIndex, int iPlusSize
    if (iNowSize <= iIndex + iPlusSize) {
        iNowSize += EXPAND_SIZE * (1 + iPlusSize / EXPAND_SIZE)
        memexpand sTarget, iNowSize
    }
    return
 
// 文字列内の対象文字列全てを置換する命令
#deffunc replace var sTarget, str sBefore, str sAfter, local sResult, local iIndex, local iIns, \
    local iStat, local iTargetLen, local iAfterLen, local iBeforeLen, local iNowSize
 
    sdim sResult, FIRST_SIZE
    iTargetLen = strlen(sTarget)
    iAfterLen  = strlen(sAfter)
    iBeforeLen = strlen(sBefore)
    iNowSize   = FIRST_SIZE
    iStat  = 0
    iIndex = 0
 
    repeat iTargetLen       // 検索・置換の開始
        iIns = instr(sTarget, cnt, sBefore)
        if (iIns < 0) {         // もう見つからないので、まだsResultに追加していない分を追加してbreak
            _expand sResult, iNowSize, iIndex, iTargetLen - cnt // オーバーフローを避けるため、メモリを再確保
            poke sResult, iIndex, strmid(sTarget, cnt, iTargetLen - cnt)
            iIndex += iTargetLen - cnt
            break
        } else {                // 見つかったので、置換して続行
            _expand sResult, iNowSize, iIndex, iIns + iAfterLen // オーバーフローを避けるため、メモリを再確保
            poke sResult, iIndex, strmid(sTarget, cnt, iIns) + sAfter
            iIndex += iIns + iAfterLen
            iStat++
            continue cnt + iIns + iBeforeLen
        }
    loop
 
    sdim sTarget, iIndex + 1
    memcpy sTarget, sResult, iIndex
    return iStat            // おまけ。置換した個数をシステム変数statに代入。
#global
 
    note = "HSPの最新バージョンは2.61です。"
    mes note
    replace note, "2.61", "3.0"
    mes note
    mes str(stat) + "回置換しました。"
添付ファイル:
filereplace.hsp
738件 [詳細]
filesample.hsp
548件 [詳細]
filereplace12.hsp
205件 [詳細]
filereplace10.hsp
217件 [詳細]
filereplace.hs
685件 [詳細]
filereplace11.hsp
200件 [詳細]
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS
Last-modified: 2009-06-03 (水) 11:05:27 (1649d)