[環境]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文字目を削除等。(!が削除記号)
色々パターンを考えると難しいかなぁと思いやめました。
以上です。
例として、指定文字=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)
試してないですが
そして適当なつくりですが
通ってみたさん回答頂き、ありがとうございます。
>> 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)
お手数をお掛けしました。
でも、この仕様に対し、関数っぽいものを外出しにするのも特に問題
ないのかなと見受けました。
回答頂き、まことにありがとうございました。
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ファイルから取得した置換パターン)
って手も。
ひろさんの方法が一番楽かも
'第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
かな
ひろさんの方法が一番楽かも
'第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
かな
でもって
>例えば、"Hello World"から、末尾に"!"を付加し、""Hello World!"
strMethod = "^(*);$1!"
>3文字目から2文字分を"ABC"に置換し、先頭1文字目を削除
strMethod = "^(.)(.)(..)(.*);$2ABC$4"
これはまだ簡単にできるかも・・
うう ぬけてる・・
>strMethod = "^(*);$1!"
strMethod = "^(.*);$1!"
ひろさん、あんさん回答頂きありがとうございます。
すんませーん、お客さんに今日の午前中に提案してまいました(汗)
そういうオブジェクトを使えば、できるんですねぇ。
存在だけは知っていたのですが、正規表現での検索を
行ってくれるものという認識しかありませんでした。
(秀丸でも、置換で正規表現というチェックボックスありますねぇ・・・
勉強不足痛感します。)
私は、正規表現は使ったことが無いのですが、
やはりパターンマッチングみたいなことができる方がスマートですね。
・・・"^(.)(.)(..)(.*);$2ABC$4"なんて、全然解読できないですが、
要求された結果通りとなっており、めちゃ感動しました。
汎用性を求めるのであれば、これが良いと思いました。
ただ、私自身が勉強することは当然なのですが、
このような仕様の説明やトレーニングする力を身に付けるのに
時間が掛かりそうなことが難点です。
もうちょっと色々な考え方を伺いたい気持ちもあるのですが、
私の方法と正規表現を使用した実現方法が分かりましたので、
『解決』とさせていただきます。
正規表現については、とりあえずHITした以下のサイトを参考に勉強したいと思います。
http://www.sixnine.net/regexp/
お付き合い頂き、ありがとうございました。
大変勉強になりました。
お掃除屋
ツイート | ![]() |