字符串的错误包含匹配

时间:2017-12-04 21:14:04

标签: vb.net

对不起,我不想在这里发布这个问题。之前已经发布过像我这样的其他问题,但我还没有找到答案。

我正在尝试使用string.contains

进行简单的字符串匹配
 If Not dataRow("Name").ToString().Contains(UserName) Then
  --do something--
End If

但那不符合我的条件

dataRow("Name").ToString()= "Steve Cook"
UserName="Cook Steve"

我想找到%like匹配(如SQL),但.contains不是我期望它做的那样?

3 个答案:

答案 0 :(得分:2)

它必须是字符串的确切部分,在您的情况下,字段不包含“Cook Steve”,就像您要求的那样,它包含(“Steve”和“Cook”)或(“Steve Cook”)

您需要拆分空格并检查每个单词。但你可能会发现一些你会得到误报的案例。

答案 1 :(得分:2)

您可以使用Regex解决问题。正则表达式与使用通配符相当,但允许您表达更复杂的搜索模式。 Google for Regex教程。你会发现很多。

Dim s As String = dataRow("Name").ToString()
If Not Regex.IsMatch(s, "\bSteve\s+Cook\b|\bCook\s+Steve\b") Then
    ' do something
End If

需要

Imports System.Text.RegularExpressions

这个正则表达式的含义是:找到整个单词(即不仅是用更长的单词嵌入的单词部分)“Steve Cook”或“Cook Steve”,它们至少由一个空格字符分隔。

您可以在此处进行测试:http://refiddle.com/nq2y

答案 2 :(得分:2)

一个简单的Comparer Class 如果字符串长度不同,则所有部分都相等,则返回false

Dim names As Names = New Names
names.CompareName = "Steve Cook"
names.ToName = "Cook steve"

If names.Compare(True) = True Then
 Console.Write("Same guy")
End If

Public Class Names
  Public Property CompareName() As String
  Public Property ToName() As String

  Public Function Compare(ByVal IgnoreCase As Boolean) As Boolean
     If CompareName.Length <> ToName.Length Then Return False

     Dim TypeOfComparison As StringComparison = If(IgnoreCase = True,
                                                 StringComparison.InvariantCultureIgnoreCase,
                                                 StringComparison.InvariantCulture)
     Dim _All As Boolean = True
     Dim _parts As String() = ToName.Split(" "c)
     For Each _part As String In _parts
        If CompareName.IndexOf(_part, 0, TypeOfComparison) < 0 Then
           _All = False
           Exit For
        End If
     Next
     Return _All
  End Function
End Class

或使用Join-Split-Reverse

Dim Name1 As String = "Steve Cook"
Dim Name2 As String = "Cook Steve"

If StringCompare(Name1, Name2) Then
    Console.Write("Same guy")
End If

Public Function StringCompare(ByVal CompName As String, ByVal ToName As String) As Boolean
   If CompName.Equals(ToName, StringComparison.InvariantCultureIgnoreCase) Then
       Return True
   End If
   If CompName.Equals(String.Join(" ", ToName.Split(" "c).AsEnumerable.Reverse()),
                      StringComparison.InvariantCultureIgnoreCase) Then
      Return True
   End If
   Return False
End Function