C#片段需要复制VBA Like运算符

我正在转换包含LIKE运算符的VBA代码,如

dim sToken as String if sToken Like "(*,*)" then ... 

在所有情况下,模式仅使用匹配任何字符串(包括空字符串)的*通配符。 VBA Like运算符只产生一个true / false结果,因此可以根据后续的VBA代码进行进一步解析,并在匹配时拔出匹配的子字符串。

如果有人能提供C#片段来测试相同类型的简单通配符,我将非常感激。 如果片段也产生匹配的子串 – 甚至更好。

那么,那个特殊的模式可以匹配

 if (sToken.StartsWith("(") && sToken.EndsWith(")") && sToken.Contains(",")) 

但一般来说,您可能会发现使用正则表达式更有意义。 例如:

 using System; using System.Text.RegularExpressions; class Program { static void Main(string[] args) { Regex regex = new Regex(@"^\(.*,.*\)$"); Console.WriteLine(regex.IsMatch("x(a,b)")); // False due to the x Console.WriteLine(regex.IsMatch("(a,b)x")); // False due to the x Console.WriteLine(regex.IsMatch("(ab)")); // False due to the lack of , Console.WriteLine(regex.IsMatch("(a,b")); // False due to the lack of ) Console.WriteLine(regex.IsMatch("(a,b)")); // True! Console.WriteLine(regex.IsMatch("(aaa,bbb)")); // True! Console.WriteLine(regex.IsMatch("(,)")); // True! } } 

这里有关于模式的注意事项:

  • 我使用了一个逐字的字符串文字 (开头的@),以便更容易正则表达式中执行转义
  • ^和$强制它匹配整个字符串
  • 括号被转义,因此它们不被视为分组运算符

MSDN “正则表达式语言元素”页面是.NET正则表达式的一个很好的参考。

有几个人建议使用正则表达式,这对于这种情况应该很有效。 另一个选择是直接从C#代码使用VB Like运算符。 这可以通过调用Compiler helper LikeOperator.LikeString来完成。 此函数位于VB运行时程序集Microsoft.VisualBasic.dll中,可从C#中使用。

 using Microsoft.VisualBasic.CompilerServices; ... if (LikeOperator.LikeString(sToken, "(*,*)")) { ... } 

我不相信这个版本与Like的VBA版本有100%的同等性,但它会非常接近并且会与常见场景相匹配。

如果你想要一些恒星匹配能力,我建议进入正则表达式 。