C # fragment, необходимый для репликации VBA. Как оператор

Я конвертирую код VBA, содержащий оператор LIKE, как в

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

Во всех случаях шаблоны используют только * подстановочный знак, который соответствует любой строке (включая пустую строку). Оператор VBA Like дает только истинный / ложный результат, поэтому до последующего кода VBA нужно разбираться дальше и вырывать соответствующие подстроки всякий раз, когда есть совпадение.

Я был бы очень благодарен, если кто-то может предоставить fragment C # для проверки того же типа простого подстановочного соответствия. Если fragment также дает соответствующие подстроки – еще лучше.

Ну, эта конкретная модель может быть сопоставлена ​​с

 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.

Несколько человек предложили регулярные выражения, которые должны хорошо работать для этого сценария. Другой вариант – использовать оператор VB Like непосредственно из кода C #. Это можно сделать, вызвав помощник компилятора LikeOperator.LikeString . Эта функция находится в сборке времени выполнения VB, Microsoft.VisualBasic.dll и может использоваться с C #.

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

Я не верю, что эта версия имеет 100% -ный паритет с версией VBA, но она будет очень близкой и будет соответствовать общим сценариям.

Если вам нужна какая-то сила звездного соответствия, я предлагаю войти в регулярные выражения .