对不起,我不想在这里发布这个问题。之前已经发布过像我这样的其他问题,但我还没有找到答案。
我正在尝试使用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
不是我期望它做的那样?
答案 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