我试图找到一个更好的解决方案来集成字符串并生成一个具有参数最大值的新字段。 @AutomatedChaos helped me代码为{{3}}。但我需要一个更好的解决方案来实现代码的灵活性。
第一个字符串由*
(星号)拆分,我想合并所有项目并创建一个具有最大值的新字符串。
fString = "projects@dnProjectsPatterning=0|dnProjectsSendReport=1#workplans@dnWorkplansAdd=0|dnWorkplansGrouping=1*projects@dnProjectsPatterning=1|dnProjectsSendReport=3#workplans@dnWorkplansAdd=1|dnWorkplansGrouping=0*projects@dnProjectsPatterning=5|dnProjectsSendReport=1#workplans@dnWorkplansAdd=0|dnWorkplansGrouping=2"
Set dict = CreateObject("Scripting.Dictionary")
Set re = New RegExp
re.Global = True
re.Pattern = "(\w+)=(\d+)"
Set matches = re.Execute(fString)
For Each match In matches
key = match.Submatches(0)
value = CInt(match.Submatches(1))
If dict.Exists(key) Then
If value < dict.Item(key) then
value = dict.Item(key)
End If
End If
dict.Item(key) = value
Next
For Each key In dict
MsgBox key & "=" & dict.Item(key)
Next
' output:
' dnProjectsPatterning=5
' dnProjectsSendReport=3
' dnWorkplansAdd=1
' dnWorkplansGrouping=2
我想生成这个字符串:
newString = "projects@dnProjectsPatterning=5|dnProjectsSendReport=3#workplans@dnWorkplansAdd=1|dnWorkplansGrouping=2"
请注意,对于projects@
和workplans@
,这两者会被#
拆分。
答案 0 :(得分:3)
这是另一个可以工作的示例如果参数总是如图所示排序。
以下代码仅将除*
之外的所有分隔符视为键的一部分。您可以查看this regexr shot以了解该模式的工作原理。
fString = "projects@dnProjectsPatterning=0|dnProjectsSendReport=1#workplans@dnWorkplansAdd=0|dnWorkplansGrouping=1*projects@dnProjectsPatterning=1|dnProjectsSendReport=3#workplans@dnWorkplansAdd=1|dnWorkplansGrouping=0*projects@dnProjectsPatterning=5|dnProjectsSendReport=1#workplans@dnWorkplansAdd=0|dnWorkplansGrouping=2"
Set params = CreateObject("Scripting.Dictionary")
With (New RegExp)
.Global = True
.Pattern = "([^=*]*)=(\d+)"
For Each match In .Execute(fString)
key = match.Submatches(0)
val = match.Submatches(1)
If params.Exists(key) Then
If val > params(key) Then params(key) = val
Else
params.Add key, val
End If
Next
End With
'temporary str dictionary to generate string
Set str = CreateObject("Scripting.Dictionary")
For Each key In params
'prepend key + "=" into items to generate merged string
str.Add key, key & "=" & params(key)
Next
newString = Join(str.Items, "") 'joining items
WScript.Echo newString
'normalize params' keys
For Each key In params
If Left(key, 1) = "|" Or Left(key, 1) = "#" Then
params.Key(key) = Mid(key, 2)
End If
Next
'lookup for `dnProjectsSendReport` parameter
WScript.Echo params("dnProjectsSendReport") 'must print 3
答案 1 :(得分:0)
我找到了解决方案:
'target = "projects@param1={param1}|param2={param2}#workplans@param3={param3}|param4={param4}..."
f_AccessArray = "projects@dnProjectsPatterning=0|dnProjectsSendReport=1#workplans@dnWorkplansAdd=0|dnWorkplansGrouping=1*projects@dnProjectsPatterning=1|dnProjectsSendReport=3#workplans@dnWorkplansAdd=1|dnWorkplansGrouping=0*projects@dnProjectsPatterning=5|dnProjectsSendReport=1#workplans@dnWorkplansAdd=0|dnWorkplansGrouping=2"
arrAccessPack = Split(f_AccessArray,"*")
endString = Split(arrAccessPack(0),"#")
nArrString = ""
for i = 0 to UBound(endString)
if i < UBound(endString) then strHash = "#" else strHash = ""
part1 = Split(endString(i),"@")(0)
part2 = Split(Split(endString(i),"@")(1),"|")
newParams = ""
for j = 0 to UBound(part2)
if j < UBound(part2) then strPipe = "|" else strPipe = ""
param = Split(part2(j),"=")(0)
newParams = newParams & param&"={"¶m&"}" & strPipe
next
nArrString = nArrString & part1&"@"&newParams & strHash
next
MergeAccessArray = MergerParams(f_AccessArray,nArrString)
Function MergerParams(fStr,fTarget)
Set dict = CreateObject("Scripting.Dictionary")
Set re = New RegExp
re.Global = True
re.Pattern = "(\w+)=(\d+)"
Set matches = re.Execute(fStr)
for each match in matches
key = match.Submatches(0)
value = cint(match.Submatches(1))
If dict.Exists(key) Then
If value < dict.Item(key) then
value = dict.Item(key)
End If
End If
dict.Item(key) = value
next
target = fTarget
for each key in dict
target = Replace(target, "{" & key & "}", dict.Item(key))
Next
MergerParams = target
End Function