的VBScript:如何大写文字的特定部分的字符串,引号外面(的)([removed] how to

2019-10-19 14:00发布

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

S =“ABC”和“防守”或“Ghin餐厅”在“京客隆”而不是“M n或”还有......或者......不...在......

和我想大写这些特定的4个运算符(在下部和上部的文本的任何组合):与,或,在,没有,为大写。

这些运营商引号(')之外存在 - 因为他们之间我有业务规则。 这一点很重要,因为,你可以在第三个规则(“Ghin餐厅”)见我“在”在规则的名称必须与在这些情况下,我不希望引号之间的文本(业务规则名称)被改变。

我该如何解决这个在VBScript,preferently使用正则表达式?

TIA

编辑:感谢您的帮助。

抱歉,我忘了提一个细节:我可以有文本引号外面,即“(”,“)”,“[”,“]”或“1 = 1”的条件,但再次:运营商是改变存在引号外,引号里什么都不做。

使用前面的例子:S =“( 'ABC' 和[ '默认值' 或 'Ghin餐厅' 在 'JKL' 不是1 = 1 AND 'M n或' 与 'PQR' 或 'XYZ' NOT 'LMN' IN 'OPQ' )”

S = “( 'ABC' AND [ '默认值' OR 'Ghin餐厅'] IN 'JKL' NOT 1 = 1 AND 'M n或' AND 'PQR' OR 'XYZ' 而不是 'LMN' IN 'OPQ')”

Answer 1:

在其他语言中,你可以使用周围图案看中的外观(逻辑)施加一个正则表达式来只有你输入的部分,在VBScript中,你应该使用一个正则表达式一国或斯普利特()替换功能。

对于第一种选择演示脚本:

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'


Answer 2:

保持由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


Answer 3:

Something like this should work

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


Answer 4:

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

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


Answer 5:

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

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

这会找到你的关键字(自己的,没有包含另一个字以内),并用大写版本替换任何实例。



文章来源: VBscript: how to Uppercase specific parts of text in a string, outside of quotes ('s)