VBscript,在一个字符串中以大写形式转换替换字符

时间:2013-05-27 04:51:53

标签: vbscript character alternate

我是VB Scripting的新手,并且问了一个问题,问题是这样的。

我有一个字符串(例如:-xx xxxxx xxxx xx xxxx xx)在这个字符串中我必须以大写字母转换替换字符,但不应该考虑单词之间的空格。

字符串的输出应该是这样的(例如: - xX xXxXx xXxX xX xXxX xX)

为此我尝试了“Mid”和“Ucase”功能,但在此考虑空间也因此我的输出不符合我的例外。

请帮帮我....

2 个答案:

答案 0 :(得分:1)

使用带有模式的RegExp查找可选空格和两个符号以及执行UCase()的替换回调函数 - 如:

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'循环字符'方法:

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引擎分割匹配)

答案 1 :(得分: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

如果您还必须处理非字母字符,则需要进行额外检查。