Фрагмент C #, необходимый для репликации оператора VBA Like - PullRequest
6 голосов
/ 28 февраля 2011

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

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

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

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

Ответы [ 3 ]

10 голосов
/ 28 февраля 2011

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

using Microsoft.VisualBasic.CompilerServices;

...

if (LikeOperator.LikeString(sToken, "(*,*)")) { 
  ...
}

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

5 голосов
/ 28 февраля 2011

Что ж, этот конкретный шаблон можно сопоставить с

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.

0 голосов
/ 28 февраля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...