複数の変換規則から、元の文字列を別の文字列に変換するには?

解決


ごめす  2005-10-04 20:18:55  No: 126042

[環境]XP/2000
[言語]VB6.0

プログラム外部(ini等)で設定された条件を読込み、
ある文字列をその条件で変換した文字列を作り出したいと考えています。
例えば、"Hello World"から、末尾に"!"を付加し、""Hello World!"
というようなものです。

実現したい内容は以下の通り。
 1.対象文字列の先頭に、文字を追加
 2.対象文字列の末尾に、文字を追加
 3.対象文字列のn文字からm文字を、条件で指定した文字で置換
 4.対象文字列のn文字の前後に条件で指定した文字を挿入
 5.上記条件の複合式

[これを行う目的]
ある名称から関連の名称を導き出す処理を、仕様変更・追加毎にプログラム改定で
対応することを避けたい。
現在対象としているのは、製品IDやKEYになるもので、20BYTE程度の
英数文字列が対象となる。

[教えていただきたい内容・アドバイス]
上記を実現するような一般的、お勧めなロジックはどのようなものがありますでしょうか。
私は、以下のような関数形式を考えておりますが、一般的であるか自身が
持てません。

[現在考えている内容]
まず、文字の付加・削除命令として、ADD,DELETEを用意し、
上記の操作対象命令(パラメータ)として、LEFT,MID,RIGHTを用意し、
各捜査対象毎に、付加文字列等のパラメータを用意します。
各パラメータは、";"で区切り、
複数条件ある場合は、","区切り、左条件から計算を行います。
※詳細は長くなるので、省略します。
例)表題の例->ADD;RIGHT;!
   3文字目から2文字分を"ABC"に置換し、先頭1文字目を削除
      ->ADD;MID;3;2;ABC,DELETE;LEFT;1

";",","で区切っているのは、Split関数で簡単に抜き出せるからです。
ADDやRIGHTは、関数内でSELECTしやすいからです。
いかがなものでしょうか。ご意見お聞かせください。

以下、ソースです。
長文になるかと思い、"DELETE"部分は省略しております。

'第1引数:元文字列、第2引数:変換後文字列、第3引数:変換用条件式
Public Function CreateOtherKeyEx(ByVal strKey As String, _
                                 ByRef strOtherKey As String, _
                                 ByVal strMethod) As Long
    Dim strWork()   As String
    Dim lngIdx      As Long
    Dim strResult   As String
    Dim lngParam(1) As Long
    Dim lngCt      As Long
    Dim strTemp()   As String
    
    On Error GoTo ErrHandler
    
    CreateOtherKeyEx = 1
    
    '複合式の分割
    strTemp = Split(strMethod, ",")
    'リターン文字列の初期化(元文字列のセット)
    strResult = strKey
    '変換キーの初期化
    strOtherKey = ""
    
    For lngCt = 0 To UBound(strTemp) Step 1
    
        '条件式の抽出(;)区切り
        strWork = Split(strTemp(lngCt), ";")
    
        '式と式パラメータの分割
        lngIdx = UBound(strWork)
        '領域無しは、ハンドリング
        '式パラメータ無しは、異常で処理終了
        If lngIdx = 0 Then
            CreateOtherKeyEx = -1
            Exit Function
        End If
        
        '処理命令(第1パラメータ)の取得
        Select Case UCase(strWork(0))
        '文字付加命令
        Case "ADD"
            '処理内容(第2パラメータ)の取得
            Select Case UCase(strWork(1))
            '先頭
            Case "LEFT"
                'キーの先頭に、第3パラメータを付加
                strResult = strWork(2) & strResult
            '文字中
            Case "MID"
                'キャスト
                lngParam(0) = Val(strWork(2))
                lngParam(1) = Val(strWork(3))
                
                'キーの第2、第3パラメータの間に、第5パラメータを付加
                strResult = Left$(strResult, lngParam(0) - 1) & strWork(4) & _
                            Mid$(strResult, lngParam(0) + lngParam(1))
            '末尾
            Case "RIGHT"
                'キーの末尾に、第3パラメータを付加
                strResult = strResult & strWork(2)
            Case Else
                Exit Function
            End Select

        Case Else
            Exit Function
        End Select
    Next lngCt
    
    strOtherKey = strResult
    CreateOtherKeyEx = 0
    Exit Function
ErrHandler:
    CreateOtherKeyEx = -999
End Function

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
・・・因みに
#や*等を使って、パターン?でチェックするのがスマート・プログラムっぽいかなと
思ったのですが、ロジックが簡単に出てこないので、上の関数形式を
考えました。

*ABCで末尾に"ABC"を追加。
##!!*で3文字目から4文字目を削除等。(!が削除記号)
色々パターンを考えると難しいかなぁと思いやめました。

以上です。


通ってみた  2005-10-04 20:43:19  No: 126043

例として、指定文字=A、対象文字列="文字列"とする

>> 1.対象文字列の先頭に、文字を追加
A + "文字列"

>> 2.対象文字列の末尾に、文字を追加
"文字列" + A

>> 3.対象文字列のn文字からm文字を、条件で指定した文字で置換
 Dim B As String

For i = 1 to m
 B = B + A
Next

Left$("文字列", n - 1) + B + Mid$("文字列", n + m)

>> 4.対象文字列のn文字の前後に条件で指定した文字を挿入
Left$("文字列", n - 1) + A + Mid$("文字列", n)

試してないですが
そして適当なつくりですが


ごめす  2005-10-04 21:36:21  No: 126044

通ってみたさん回答頂き、ありがとうございます。

>> 3.対象文字列のn文字からm文字を、条件で指定した文字で置換
> Dim B As String
>
>
>For i = 1 to m
> B = B + A
>Next
>
>Left$("文字列", n - 1) + B + Mid$("文字列", n + m)

・・・すみません、質問がまずかったです。
n文字からm文字目までの文字列を指定した文字列で置換するです。
ですので、ワークは不要で以下で良いと思います。
Left$("文字列", n - 1) + A + Mid$("文字列", n + m)

お手数をお掛けしました。

でも、この仕様に対し、関数っぽいものを外出しにするのも特に問題
ないのかなと見受けました。
回答頂き、まことにありがとうございました。


ひろ  2005-10-05 18:29:06  No: 126045

Microsoft VBScript Regular Expressions を参照設定に追加して
Set re = new regexp  'Create the RegExp object
Dim inStr As String
Dim outStr As String

rs.Pattern = iniファイルから取得した置換対象検索パターン
outStr = rs.replace(inStr, iniファイルから取得した置換パターン)

って手も。


あん  2005-10-05 20:37:16  No: 126046

ひろさんの方法が一番楽かも

'第1引数:元文字列、第2引数:変換後文字列、第3引数:変換用条件式
Public Function CreateOtherKeyEx(ByVal strKey As String, _
                                 ByRef strOtherKey As String, _
                                 ByVal strMethod) As Long
Dim strWork()   As String
Set re = new regexp  'Create the RegExp object

  On Error GoTo ErrHandler

  strTemp = Split(strMethod, ";")
  re.Pattern = strTemp(0)
  strOtherKey  = re.replace(strKey, strTemp(1))

  CreateOtherKeyEx = 0
  Exit Function

ErrHandler:
  CreateOtherKeyEx = -999

End Function

かな


あん  2005-10-05 20:37:17  No: 126047

ひろさんの方法が一番楽かも

'第1引数:元文字列、第2引数:変換後文字列、第3引数:変換用条件式
Public Function CreateOtherKeyEx(ByVal strKey As String, _
                                 ByRef strOtherKey As String, _
                                 ByVal strMethod) As Long
Dim strWork()   As String
Set re = new regexp  'Create the RegExp object

  On Error GoTo ErrHandler

  strTemp = Split(strMethod, ";")
  re.Pattern = strTemp(0)
  strOtherKey  = re.replace(strKey, strTemp(1))

  CreateOtherKeyEx = 0
  Exit Function

ErrHandler:
  CreateOtherKeyEx = -999

End Function

かな


あん  2005-10-05 20:46:05  No: 126048

でもって

>例えば、"Hello World"から、末尾に"!"を付加し、""Hello World!"
strMethod = "^(*);$1!"

>3文字目から2文字分を"ABC"に置換し、先頭1文字目を削除
strMethod = "^(.)(.)(..)(.*);$2ABC$4"
これはまだ簡単にできるかも・・


ann  2005-10-05 20:48:12  No: 126049

うう  ぬけてる・・

>strMethod = "^(*);$1!"
strMethod = "^(.*);$1!"


ごめす  2005-10-06 02:05:51  No: 126050

ひろさん、あんさん回答頂きありがとうございます。

すんませーん、お客さんに今日の午前中に提案してまいました(汗)

そういうオブジェクトを使えば、できるんですねぇ。
存在だけは知っていたのですが、正規表現での検索を
行ってくれるものという認識しかありませんでした。
(秀丸でも、置換で正規表現というチェックボックスありますねぇ・・・
  勉強不足痛感します。)

私は、正規表現は使ったことが無いのですが、
やはりパターンマッチングみたいなことができる方がスマートですね。
・・・"^(.)(.)(..)(.*);$2ABC$4"なんて、全然解読できないですが、
要求された結果通りとなっており、めちゃ感動しました。

汎用性を求めるのであれば、これが良いと思いました。
ただ、私自身が勉強することは当然なのですが、
このような仕様の説明やトレーニングする力を身に付けるのに
時間が掛かりそうなことが難点です。

もうちょっと色々な考え方を伺いたい気持ちもあるのですが、
私の方法と正規表現を使用した実現方法が分かりましたので、
『解決』とさせていただきます。

正規表現については、とりあえずHITした以下のサイトを参考に勉強したいと思います。
http://www.sixnine.net/regexp/

お付き合い頂き、ありがとうございました。
大変勉強になりました。


お掃除屋  2005-10-06 22:31:17  No: 126051

お掃除屋


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加