VB.net中如何实现完整字符串与含通配符字符串的匹配比较?

2026-05-06 08:191阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计600个文字,预计阅读时间需要3分钟。

VB.net中如何实现完整字符串与含通配符字符串的匹配比较?

我有一种方法,需要两个字符串参数。一个包含普通字符串,另一个包含带有至少一个通配符的字符串。以下是一个示例代码:

Private Function DoesMatchWildcardString(ByVal fullString As String, ByVal wildcardString As String)

这个函数用于检查`fullString`是否与`wildcardString`匹配。

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

VB.net中如何实现完整字符串与含通配符字符串的匹配比较?

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”,但我自己从未读过).

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

如果要更正自己的算法,请用IndexOf替换Contains调用,并提供它应该开始搜索的位置 – 即在上一次匹配之后.这适用于大多数情况,但它会执行非贪婪搜索,在某些情况下可能会失败.详尽的搜索必然会回溯.正如我所说,这是低效的,并且移位或算法不会受到这个缺点的影响.

但是所有这些都是不必要的,因为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("*")

此外,将布尔值与文字(If X = False …)进行比较是没有意义的.写吧

If fullString.Contains(str) Then

标签:进行

本文共计600个文字,预计阅读时间需要3分钟。

VB.net中如何实现完整字符串与含通配符字符串的匹配比较?

我有一种方法,需要两个字符串参数。一个包含普通字符串,另一个包含带有至少一个通配符的字符串。以下是一个示例代码:

Private Function DoesMatchWildcardString(ByVal fullString As String, ByVal wildcardString As String)

这个函数用于检查`fullString`是否与`wildcardString`匹配。

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

VB.net中如何实现完整字符串与含通配符字符串的匹配比较?

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”,但我自己从未读过).

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

如果要更正自己的算法,请用IndexOf替换Contains调用,并提供它应该开始搜索的位置 – 即在上一次匹配之后.这适用于大多数情况,但它会执行非贪婪搜索,在某些情况下可能会失败.详尽的搜索必然会回溯.正如我所说,这是低效的,并且移位或算法不会受到这个缺点的影响.

但是所有这些都是不必要的,因为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("*")

此外,将布尔值与文字(If X = False …)进行比较是没有意义的.写吧

If fullString.Contains(str) Then

标签:进行