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:比较两个字符串逻辑并返回真或假的主要内容,如果未能解决你的问题,请参考以下文章

PHP - 根据用户单击的按钮返回真或假

“返回 x == y”是啥意思? [复制]

如何检查 jQuery 查找返回真或假? [复制]

Javascript 函数 img.onload 不返回任何内容(真或假)

假或真!=真或假!=真||错误[重复]

Java初学者,比较嵌套for循环中的字符串