我需要你的帮助。 在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)