VBA:比较两个字符串逻辑并返回真或假
Posted
技术标签:
【中文标题】VBA:比较两个字符串逻辑并返回真或假【英文标题】:VBA: compare two strings logic and return true or false 【发布时间】:2014-10-05 20:44:27 【问题描述】:我想以特定方式比较两个字符串。
字符串是由单词、运算符(“+” = AND、“/” = OR)和括号组成的逻辑语句。 每个词都可以是真或假。 一个句子没有特定的模式 - 可以给出任何单词和运算符的组合
我需要根据两个比较的句子是否相同来计算返回真或假的函数。
让我评估几个例子:
示例 1:
s1 = "A+B+C"
s2 = "A+B+C"
compare(s1, s2) 'will result True
示例 2:
s1 = "A+B+C"
s2 = "A+C+B"
compare(s1, s2) 'will result True
示例 3:
s1 = "(A/B)+C"
s2 = "A/B/C"
compare(s1, s2) 'will result False
示例 4:
s1 = "(A/B)+C"
s2 = "A/(B+C)"
compare(s1, s2) 'will result False
示例 5:
s1 = "(B/A)+(B/C)"
s2 = "(C/B)+(B/A)"
compare(s1, s2) 'will result True
示例 6:
s1 = "A+B"
s2 = "A+W"
compare(s1, s2) 'will result False
示例 7:
s1 = "A/B+C"
s2 = "A/(B+C)"
compare(s1, s2) 'will result False
示例 8:
s1 = "A/B+C"
s2 = "(A/B)+C"
compare(s1, s2) 'will result True
现实世界中句子中的单词不是 A、B、C...,而是更像 BRS21A、4FCCS... 可以是实际由 [a-Z 0-9] 组成的任何字符串
任何句子都可以包含任何单词的任意组合
运算符总是“/”表示 OR 和/或“+”表示 AND,如果句子是单个单词,则没有运算符
非常感谢任何提示
【问题讨论】:
这些值BRS21A, 4FCCS
存储在哪里?您打算如何调用该函数?在工作表或 VBA 中?除了 Example 5
! 之外,数学上的一切都是有意义的
它们存储在 vba 变量中,但作为字符串的一部分,而不是作为单个变量,例如“BRS21A/4FCCS”或“BRS21A”或“4FCCS+BRS21A”——只是几个例子。我想在进一步的 VBA 操作中检索函数结果,即 if compare(s1,s2) = True then...
听起来你需要实现一个小解析器。如果单词集是固定的,您可以尝试为每个单词分配一个数字并计算等式的结果,例如A = 1024 和 B = 2048,然后通过计算 A + B = 3072 = B + A。理想情况下必须选择这些数字,以便您的 AND/OR 计算影响不同的位。
A、B、BRS21A、ANYTHING 只能是 True 或 False。词组不固定。
【参考方案1】:
我会在比较函数中采用两步法。首先,我会用一个数字替换每个单词。其次,我会评估公式以查看两个输入的结果是否相等。
部分伪代码:
Function compare(s1 As String, s2 As String) As Boolean
compare = parseAndEvaluate(s1) = parseAndEvaluate(s2)
End Function
Function parseAndEvaluate(str As String) As Long
' parse() needs to be implemented
For Each charOrWord in parse(str)
Select Case charOrWord
Case "+", "/", "(", ")":
parsedStr = parsedStr + charOrWord
Case Else:
' map() needs to be implemented
parsedStr = parsedStr + map(charOrWord)
End Select
Next
parseAndEvaluate = Application.Evaluate(parsedStr)
End Function
map()
函数也可以是某种字典,为新单词分配一个新数字(例如 1024、2048...),并将之前使用的单词映射到之前返回的数字。
parse()
函数将读取字符串并在单词边界处拆分。
如果您的操作+
和/
比较困难,您将需要稍微复杂一点的解析代码,将OR(..., ...)
或AND(..., ...)
写入传递给Application.Evaluate
的字符串中。
【讨论】:
以上是关于VBA:比较两个字符串逻辑并返回真或假的主要内容,如果未能解决你的问题,请参考以下文章