次のように、オプションのスペースと 2 つのシンボルを検索するパターンと、UCase() を実行する置換コールバック関数で RegExp を使用します。
Dim aTests : aTests = Array( _
Array("", "") _
, Array("xx", "xX") _
, Array("aB cD", "aB cD") _
, Array("xx xxxxx xxxx xx xxxx xx", "xX xXxXx xXxX xX xXxX xX")_
, Array(" ab cd", " aB cD") _
)
Dim re : Set re = New RegExp
re.Global = True
re.Pattern = " ?.."
Dim rf : Set rf = GetRef("ReRpl")
Dim aTest
For Each aTest In aTests
WScript.Echo "-----", qq(aTest(0))
Dim sRes : sRes = re.Replace(aTest(0), rf)
If sRes = aTest(1) Then
WScript.Echo " ok", qq(sRes)
Else
WScript.Echo " res", qq(sRes)
WScript.Echo " exp", qq(aTest(1))
End If
Next
Function ReRpl(sM, nP, sS)
Dim nL : nL = Len(sM)
ReRpl = Left(sM, nL - 1) & UCase(Mid(sM, nL))
End Function
出力:
----- ""
ok ""
----- "xx"
ok "xX"
----- "aB cD"
ok "aB cD"
----- "xx xxxxx xxxx xx xxxx xx"
ok "xX xXxXx xXxX xX xXxX xX"
----- " ab cd"
ok " aB cD"
本番環境に入る前に、さらにテスト ケースを追加してください。あなたの仕様については完全にはわかりません。
アップデート:
仕様に取り組むことを奨励するために (さらにいくつかのサンプルを追加しますか?)、@Ansgar の「キャラクターのループ」アプローチの 2 つのバージョンを追加します。
Function Ucase2ndAW(s)
Ucase2ndAW = ""
Dim bUC : bUC = False
Dim p
For p = 1 To Len(s)
Dim c : c = Mid(s, p, 1)
If " " <> c Then
If bUC Then c = UCase(c)
bUC = Not bUC
End If
Ucase2ndAW = Ucase2ndAW & c
Next
End Function
Function Ucase2ndEH(s)
Ucase2ndEH = ""
Dim bUC : bUC = False
Dim p
For p = 1 To Len(s)
Dim c : c = Mid(s, p, 1)
If " " <> c Then
If bUC Then c = UCase(c)
bUC = Not bUC
Else
bUC = False
End If
Ucase2ndEH = Ucase2ndEH & c
Next
End Function
新しいテスト ドライバー:
Dim aTests : aTests = getTests()
Dim aTest
Dim re : Set re = New RegExp
re.Global = True
re.Pattern = "( ?.)(.)"
Dim rf : Set rf = GetRef("ReRpl02")
For Each aTest In aTests
WScript.Echo "-----", qq(aTest(0))
WScript.Echo " exp", qq(aTest(1))
WScript.Echo " AW", qq(Ucase2ndAW(aTest(0)))
WScript.Echo " EH", qq(Ucase2ndEH(aTest(0)))
WScript.Echo " RE", qq(re.Replace(aTest(0), rf))
Next
およびその出力:
----- ""
exp ""
AW ""
EH ""
RE ""
----- "xx"
exp "xX"
AW "xX"
EH "xX"
RE "xX"
----- "aB cD"
exp "aB cD"
AW "aB cD"
EH "aB cD"
RE "aB cD"
----- "xx xxxxx xxxx xx xxxx xx"
exp "xX xXxXx xXxX xX xXxX xX"
AW "xX xXxXx XxXx Xx XxXx Xx"
EH "xX xXxXx xXxX xX xXxX xX"
RE "xX xXxXx xXxX xX xXxX xX"
公開するのを忘れていた
Function ReRpl02(sM, sG1, sG2, nP, sS)
ReRpl02 = sG1 & UCase(sG2)
End Function
(RegExp エンジンに一致の分割を行わせる方がはるかに簡単です)