我需要你的帮助。 在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')”
答案 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
这将找到您的关键字(单独使用,不包含在另一个单词中)并用大写版本替换任何实例。