问:我想将字符串与具有通配符(*和?)的模式匹配。我知道在VB.Net中,我可以使用Like运算符执行此操作,但我如何使用C#?
VB中的示例:
Private Sub Match()
Dim testCheck As Boolean
testCheck = "apple" Like "*p?e"
End Sub
问:C#中的代码?
答案 0 :(得分:8)
c#中没有类似的操作符。
VB.NET将您的代码编译为以下LikeOperator.LikeString
方法调用:
bool testCheck = LikeOperator.LikeString("apple", "*p?e", CompareMethod.Binary);
如果您添加对Microsoft.VisualBasic.dll
的引用并使用Microsoft.VisualBasic.CompilerServices
添加,则可以直接调用此方法,但我不建议这样做。
您应该学习正则表达式并使用正确的正则表达式而不是Like
运算符。等同于你的表达式将是:
.*p.e
答案 1 :(得分:6)
在C#中,您可以使用正则表达式:
bool matches = Regex.IsMatch("apple", ".*p.e");
更换:
*
.*
(多个字符,零个或多个)
?
(一个字符)的 .
答案 2 :(得分:1)
正如其他人所指出的,这可能是正则表达式的工作。
尽管如此,我认为编写一个实现此逻辑的微小扩展方法并提出以下内容可能会很有趣:
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#。
答案 3 :(得分:0)
C#中没有Like
。使用正则表达式来获得所需的功能。
您可能想要从这个简介教程开始:C# Regex.Match
答案 4 :(得分:-2)
Regex.IsMatch("apple", "*p?e")
用于简单模式匹配:
string.Contains()