VBscript:如何在字符串中的大写文本的特定部分,在引号之外('s)

时间:2014-03-17 10:31:41

标签: regex string text vbscript uppercase

我需要你的帮助。 在vbscript中我有一个字符串,如

s ='Abc'和'Def'或'Ghin'在'jkl'而不是'mnoR'并且......或者......不... iN ...

我希望将这些特定的4个运算符(在低位和高位文本的任意组合中)大写:和,或者,在,而不是大写。

这些运算符存在于引号(')之外 - 因为它们之间我有业务规则。这很重要,因为正如您在第3条规则('Ghin')中所看到的,我在规则的名称中有'in',在这些情况下,我不希望更改引号(业务规则名称)之间的文本

我如何在vbscript中解决这个问题,优先使用RegEx?

TIA

编辑: 谢谢你的帮助。

很抱歉,但我忘了提一个细节:我可以在引号之外加上文字,即“(”,“)”,“[”,“]”或条件为“1 = 1”,但同样:要改变的运算符存在于引号之外,引号内部没有任何内容。

使用前面的示例: s =“('abc'和['Def'或'Ghin']在'jkl'中不是1 = 1 AND'mnoR'和'pqr'或'xyz'NOT'lmn'iN'Opq')”

s =“('abc'和''Def'OR'Ghin'] IN'jkl'NOT 1 = 1 AND'mnoR'和'pqr'OR'xyz'Not'lmn'IN'Opq')”

5 个答案:

答案 0 :(得分:4)

在其他语言中,您可以使用花哨的环绕模式来(逻辑上)仅将regexp应用于输入的部分,在VBScript中,您应该使用带状态的regexp替换函数或Split()。

第一个替代方案的演示脚本:

Dim gb_magic : gb_magic = True
Function gf_magic(sMatch, nPos, sSrc)
  gf_magic = sMatch
  If "'" = sMatch Then
     gb_magic = Not gb_magic
  Else
     If gb_magic Then
        gf_magic = UCase(sMatch)
     End If
  End If
End Function

  Dim s : s = "s = 'Abc and def' and 'not Def' Or 'Ghin' In 'jkl in or' not 'mnoR'"
  WScript.Echo s
  Dim r : Set r = New RegExp
  r.Global     = True
  r.IgnoreCase = True
  r.Pattern    = "and|not|or|in|'"
  gb_magic     = True
  s = r.Replace(s, GetRef("gf_magic"))
  WScript.Echo s

输出:

s = 'Abc and def' and 'not Def' Or 'Ghin' In 'jkl in or' not 'mnoR'
s = 'Abc and def' AND 'not Def' OR 'Ghin' IN 'jkl in or' NOT 'mnoR'

答案 1 :(得分:1)

保持Ekkehard解决方案公开方法,但将状态变量转换为正则表达式。

它的缺点是函数内部有字符串连接,但只能为找到的运算符而不是引号调用它。

Dim originalString    
    originalString = "not 'Abc and def' and 'not Def' Or 'Ghin' In 'jkl in or' not 'mnoR' and"

Dim convertedString

    Function correctCase(matchString,leftPart,operator,rightPart,position,sourceString)
        correctCase = leftPart & UCase(operator) & rightPart
    End Function 

    With New RegExp
        .Pattern = "((?:'[^']*'){0,}\s*)(and|or|not|in)((?:\s*'[^']*'){0,})"
        .Global = True 
        .IgnoreCase = True
        convertedString = .Replace(originalString,GetRef("correctCase"))
    End With 

    WScript.Echo originalString
    WScript.Echo convertedString

答案 2 :(得分:0)

这样的事情应该有效

Dim s

s = "'abc' and 'Def' Or 'Ghin' In 'jkl' not 'mnoR' And 'pqr' or 'xyz' NOT 'lmn' iN 'asd'"

s = RegExReplace(s,"\band\b","AND")
s = RegExReplace(s,"\bor\b","OR")
s = RegExReplace(s,"\bnot\b","NOT")
s = RegExReplace(s,"\bin\b","IN")
msgbox s

Function RegExReplace(OriginalStr, RegExPattern, NewStr)
    Set objRegEx = CreateObject("VBScript.RegExp")
    objRegEx.Global = True   
    objRegEx.IgnoreCase = True
    objRegEx.Pattern = RegExPattern
    RegExReplace=objRegEx.Replace(OriginalStr, NewStr)
End Function

答案 3 :(得分:0)

使用正则表达式是必须的吗?

s = "('abc' and ['Def' Or 'Ghin'] In 'jkl' not 1=1 AND 'mnoR' And 'pqr' or 'xyz' NOT 'lmn' iN 'Opq')"
p = split(s, "'")
for i = 0 to ubound(p) step 2
    p(i) = ucase(p(i))
next
r = join(p, "'")
msgbox r

答案 4 :(得分:0)

我同意正则表达式解决方案是要走的路。但在我看来,你可以只搜索被空格包围的关键字,除非你的业务规则当然也包括那种类型的模式。

For Each k In Array(" AND ", " OR ", " IN ", " NOT ")
    s = Replace(s, k, k, 1, -1, vbTextCompare)
Next

这将找到您的关键字(单独使用,不包含在另一个单词中)并用大写版本替换任何实例。