gpt4 book ai didi

VB.net 将完整字符串与包含通配符的字符串进行比较

转载 作者:行者123 更新时间:2023-12-04 23:27:22 29 4
gpt4 key购买 nike

我有一个接受 2 个字符串参数的方法。一种包含普通字符串,另一种包含带有一个或多个通配符的字符串。我试过以下代码:

Private Function DoesMatchWildcardString(ByVal fullString As String, ByVal wildcardString As String) As Boolean
Dim stringParts() As String
Dim matches As Boolean = True

stringParts = wildcardString.Split("*")

For Each str As String In stringParts
If fullString.Contains(str) = False Then
matches = False
End If
Next

Return matches

End Function

我意识到它不能正常工作。如果我将 ABCD 作为普通字符串并将 A*CD 作为我的通配符字符串,那么即使我的普通字符串是 CDAB,匹配也将起作用,这不是我想要的。

有任何想法吗??

非常感谢。

最佳答案

您的方法很有趣,但即使纠正后效率也很低。通配符匹配算法的有效实现使用了 shift-or algorithm 的扩展。 (根据维基百科的说法,某些来源也将其称为“bitap”,但我自己从未读过)。

对传统移位或算法的唯一更改是在预处理中:对于每个 *您在模式中遇到的,在此位置启用字母表中的所有字符。

如果您想更正自己的算法,请替换 Contains调用 IndexOf ,并提供它应该开始搜索的位置 - 即,在前一个匹配之后。这适用于大多数情况,但它会执行非贪婪搜索,但在某些情况下可能会失败。详尽的搜索必然会回溯。正如我所说,这是低效的,而且 shift-or 算法没有这个缺点。

但这一切都是不必要的因为 VB 已经提供了必要的操作符: Like

If fullString Like wildcardString Then
' Yep, matches.
End If

风格注意事项:

声明变量时总是初始化变量,不要不必要地将声明和初始化分开。

也就是说,写
Dim stringParts As String() = wildcardString.Split("*")
' or, with Option Infer On:
Dim stringParts = wildcardString.Split("*")

此外,将 bool 值与文字( If X = False ...)进行比较是没有意义的。写就好了
If fullString.Contains(str) Then

关于VB.net 将完整字符串与包含通配符的字符串进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10625921/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com