2014-02-17 75 views
1

問:我想匹配具有通配符(*和?)的模式的字符串。我知道在VB.Net中,我可以使用Like運算符來做到這一點,但我該如何在C#中做到這一點?C#中Like運算符的替代方法是什麼?

實施例VB:

Private Sub Match() 
    Dim testCheck As Boolean 
    testCheck = "apple" Like "*p?e" 
End Sub 

問:代碼在C#?

+0

您可能必須在C#中使用正則表達式 – luke2012

回答

5

在C#中,你可以使用正則表達式:

bool matches = Regex.IsMatch("apple", ".*p.e"); 

更換:

*.*(多個字符,零或更多)

?.(一個字符)

8

在c#中沒有這樣的操作符。

VB.NET編譯你的代碼,以下LikeOperator.LikeString方法調用:

bool testCheck = LikeOperator.LikeString("apple", "*p?e", CompareMethod.Binary); 

您可以直接調用此方法,如果你Microsoft.VisualBasic.dll添加引用,並添加使用Microsoft.VisualBasic.CompilerServices,但我不會建議這樣做

您應該學習正則表達式,並使用適當的正則表達式而不是Like運算符。相當於你的表達將是:

.*p.e 
+0

爲什麼您不會建議使用LikeOperator.LikeString?你能提供更多的信息嗎?謝謝! –

0

在C#中沒有Like。使用正則表達式來獲得你想要的功能。

你可能要開始使用此介紹教程:C# Regex.Match

-2
Regex.IsMatch("apple", "*p?e") 

簡單的模式匹配:

string.Contains() 
+1

這個正則表達式並不等於問題中的表達式。 – Szymon

0

正如其他人所指出的那樣,這可能是對正則表達式的工作。

儘管如此,我想這可能是有趣的編寫實現這個邏輯微小的擴展方法,並具有以下想出了:

static class StringCompareExtensions 
{ 
    public static bool IsLike(this string s, string s2) 
    { 
     int matched = 0; 

     for (int i = 0; i < s2.Length; i++) 
     { 
      if (matched >= s.Length) 
       return false; 

      char c = s2[i]; 
      if (c == '?') 
       matched++; 
      else if (c == '*') 
      { 
       if ((i + 1) < s2.Length) 
       { 
        char next = s2[i + 1]; 
        int j = s.IndexOf(next, matched + 1); 
        if (j < 0) 
         return false; 
        matched = j; 
       } 
       else break; // '*' matches rest of s 
      } 
      else 
      { 
       if (c != s[matched]) 
        return false; 
       matched++; 
      } 
     } 
     return (matched == s.Length); 
    } 
} 

你會使用這樣的:

string s = "12345"; 
Console.WriteLine(s.IsLike("1*5")); // Returns true 

當然,您可以使用正則表達式編寫相同的方法,這會比上面的方法更短更簡單。

編輯:

我有一個小的時間與這個今天的發揮。我最終寫了一篇文章,介紹了幾種可以從C#中獲得Like運算符功能的方法。該文章是Implementing VB's Like Operator in C#

相關問題