Как структурировать простую программу для проверки входных данных для частичных совпадений с использованием регулярных выражений в C # - PullRequest
1 голос
/ 17 октября 2019

Я пытаюсь создать класс для частичных совпадений с использованием регулярных выражений. В основном я заблудился относительно того, как выполнить поиск.

Ввод будет выглядеть как «мучная # дрожжевая # банановая», где # будет означать неизвестную длину, неизвестную коллекцию букв. Поиск должен сохранять порядок муки_ _ _ Дрожжи _ _ _Banana. Таким образом, совпадения будут включать

"flouryeastbanana"

"flouraddyeastmashbanana"

"flouraddyeastbanana"

, но не

"yeastflourbanana"

код регулярного выражения, о котором я думаю: @ "^ [a - zA - Z] + $"

и то, что я получил до сих пор, это

static void Main(string[] args)
    {
        string[] input = "flour#yeast#banana".Split('*');
        string[] searchblock = new string[4] { "flouryeastbanana", "flouraddyeastmashbanana", "flouraddyeastbanana", "yeastflourbanana" };
        string pattern = @" ^[a - zA - Z] + $";


        foreach (string s in searchblock)
        {
            if (System.Text.RegularExpressions.Regex.IsMatch(s, pattern, System.Text.RegularExpressions.RegexOptions.IgnoreCase))
            {
                Console.WriteLine($"  (match for '{pattern}' found)");
            }
        }
        Console.ReadLine();
    }

но я не могу понять, как идти дальше с этим, и при этом я не знаю, как заставить его искать больше, чем 1/0 случайной буквы ... так что я почти уверен, что ошибаюсь

1 Ответ

2 голосов
/ 17 октября 2019

Я бы просто заменил '*' во входной строке (или это '#'? Ваш вопрос неясен ... повествование говорит об одном, код подразумевает другое) на ".*?", а затем использовал бы всеСтрока как ваш шаблон. Например:

static void Main(string[] args)
{
    string input = "flour*yeast*banana";
    string[] searchblock = new string[4] { "flouryeastbanana", "flouraddyeastmashbanana", "flouraddyeastbanana", "yeastflourbanana" };
    string pattern = input.Replace("*", ".*?");

    foreach (string s in searchblock)
    {
        if (System.Text.RegularExpressions.Regex.IsMatch(s, pattern, System.Text.RegularExpressions.RegexOptions.IgnoreCase))
        {
            Console.WriteLine($"input \"{s}\":  (match for '{pattern}' found)");
        }
    }
}

Последовательность ".*?" в регулярном выражении говорит, что соответствует любому количеству любого символа с наименьшим количеством символов, которое все еще позволит совпадению быть успешным. Используя его вместо маркера во входной строке, это позволяет любой строке с вашими немаркерными строками, разделенными любыми другими символами, совпадать.

Обратите внимание, что ? в строке, вероятно, необязательно втвой случай. Это будет иметь незначительное различие в том, где совпадения произошли, если вы представили шаблон со строками, которые включали немаркерные строки несколько раз, но не должны влиять на , действительно ли строки совпадают или нет. Поэтому, если вы предпочитаете, вы могли бы просто использовать ".*" в качестве текста замены вместо ".*?".

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