更改字符串中的子字符串

时间:2014-01-16 14:37:25

标签: regex vbscript automation

我在VBScript中有一个变量“Variable”,它将根据来自我不信任的xml文件的名称接收不同的值。我不能让“变量”上有禁止的字符(<,>,:,“,/,\,|,?,*)或带重音的字符(我认为它们在英语中称为重音),如( Á,á,É,é,Â,â,Ê,ê,ñ,ã)。

所以,我的问题是:我如何创建一个脚本来研究和替换我所拥有的变量中的这些可能的多个可能的字符?我正在使用MSDN Library中的替换功能,但它不会让我以我使用它的方式改变许多字符。

示例:

(假设Node.Text值为“Example A / S”)

For Each Node In xmlDoc.SelectNodes("//NameUsedToRenameFile")
     Variable = Node.Text
Next

Result = Replace(Variable, "<", "-")
Result = Replace(Variable, "/", "-")

WScript.Echo结果 上面的Echo返回“示例A-S”,但是如果我更改了我的替换顺序,例如:

Result = Replace(Variable, "/", "-")
Result = Replace(Variable, "<", "-")

我得到了“示例A / S”。我应该如何编程以准备任何可能的角色?谢谢!

2 个答案:

答案 0 :(得分:1)

如上所述,反过来做事可能更容易;创建一个允许的characrters列表,因为VBScript不是很擅长处理类似字符的unicode;虽然您列出的字符可能没问题,但您可能会遇到某些字符集的问题。这是一个可以帮助你的事业的例子例程:

考虑这个命令:

wscript.echo ValidateStr("This393~~_+'852Is0909A========Test|!:~@$%#@@#")

使用下面的示例程序,它应该产生以下结果:

  

This393852Is0909ATest

样本例程:

Function ValidateStr (vsVar)
    Dim vsAllowed, vscan, vsaScan, vsaCount
    vsAllowed = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
    ValidateStr = ""
    If vartype(vsvar) = vbString then
        If len(vsvar) > 0 then 
            For vscan = 1 To Len(vsvar)
               vsValid = False          
               vsaCount = 1
               Do While vsaValid = false and vsaCount <= len(vsAllowed)
                   If UCase(Mid(vsVar, vscan, 1)) = Mid(vsAllowed, vsaCount, 1) Then vsValid = True
                   vsaCount = vsaCount + 1
               Loop
               If vsValid Then ValidateStr = ValidateStr & Mid(vsVar, vscan,1)
            Next
        End If
    End If
End Function

我希望这可以帮助你完成任务。享受!

编辑:如果您希望继续使用原始路径,则需要修复替换命令 - 它不起作用,因为您在每行之后重置它。你需要第一次在variable抽水,然后每隔一次使用result ..

你有:

Result = Replace(Variable, "/", "-")
Result = Replace(Variable, "<", "-")

您需要将其更改为:

Result = Replace(Variable, "/", "-")
Result = Replace(Result, "<", "-")
Result = Replace(Result, ...etc..)
Result = Replace(Result, ...etc..)

编辑:您可以尝试Ansgar的正则表达式,因为代码更简单,但我不确定它是否会起作用,如果您在字符串中简化了中文字符。

答案 1 :(得分:0)

我同意Damien更换除了已知良好角色之外的所有内容是更好的方法。但是,我会使用正则表达式,因为它极大地简化了代码。我还建议不要删除“坏”字符,而是用已知良好的占位符(例如下划线)替换它们,因为删除字符可能会产生不良结果。

Function SanitizeString(str)
  Set re = New RegExp
  re.Pattern = "[^a-zA-Z0-9]"
  re.Global  = True

  SanitizeString = re.Replace(str, "_")
End Function