0

こんにちは、私は VB Scripting の初心者で、質問に行き詰まっており、質問はこのようなものです。

この文字列に文字列 (例:- xx xxxxx xxxx xx xxxx xx) があります。大文字の代替文字を変換する必要がありますが、単語間のスペースを考慮しないでください。

文字列の出力は次のようになります (例:- xX xXxXx xXxX xX xXxX xX)

このために、「Mid」および「Ucase」機能を試しましたが、これではスペースも考慮していたため、出力が例外を満たしていません。

これで私を助けてください....

4

2 に答える 2

1

次のように、オプションのスペースと 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 エンジンに一致の分割を行わせる方がはるかに簡単です)

于 2013-05-27T06:47:34.960 に答える
0

私は次のようなものを使用します:

s1 = "xx xxxxx xxxx xx xxxx xx"
s2 = ""

makeUpperCase = False
For i = 1 To Len(s1)
  c = Mid(s1, i, 1)
  If c = " " Then makeUpperCase = False
  If makeUpperCase Then c = UCase(c)
  s2 = s2 & c
  If c <> " " Then makeUpperCase = Not makeUpperCase
Next

WScript.Echo s2

文字以外の文字も処理する必要がある場合は、追加のチェックが必要です。

于 2013-05-27T08:46:33.003 に答える