Проблема с шаблоном регулярных выражений в C # - PullRequest
1 голос
/ 11 октября 2019

У меня проблема с шаблоном регулярных выражений в языке программирования C #. Мой шаблон регулярных выражений, похоже, не работает так, как в Regexr, я получаю совпадения даже для значений, не пустых или не в списке, где мое регулярное выражение предназначено для определенного списка значений и пустой строки. Ниже приведен фрагмент кода, который может продемонстрировать суть проблемы:

using System;
using System.Text.RegularExpressions;

public class Program
{
    public static void Main()
    {
        var pattern = "^(2|4|First|Fourth)?";
        var regex = new Regex(pattern);
        var empty = "";
        var number = "3";
        var yes = "yes";
        var str = "str";

        Console.WriteLine("empty " + regex.IsMatch(empty));
        Console.WriteLine("number " + regex.IsMatch(number));
        Console.WriteLine("yes " + regex.IsMatch(yes));
        Console.WriteLine("string " + regex.IsMatch(str));
    }
}

Это соответствует str и 3, когда это не должно быть. Может быть, вы могли бы предложить какое-то решение?

Ответы [ 2 ]

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

Pattern (2|4|First|Fourth) будет соответствовать 2 или 4 или First или Fourth, вы правы, ^ соответствует началу строки (так называемый якорь), но то, что вы не знаетеявляется ? оператором, что означает ** соответствует нулю или одному вхождению шаблона , so, since it's applied to whole (2 | 4 | First | Fourth) `, он будет соответствовать каждой строке.

Вы можете подумать об этомas: соответствовать моему шаблону, привязанному в начале строки hte, но соответствовать ему ноль или один раз, так, также соответствовать только началу строки .

См. Demo , что каждая строка соответствует (она соответствует началу строки).

Просто удалите оператор ? или замените его на $, который соответствует концу строки (если это желательно).

Чтобы разрешить также пустую строку, используйте ^(2|4|First|Fourth|)$ - она ​​будет привязывать конец строки с помощью $ (как упомянуто выше), также добавлена ​​еще одна возможность в вашем чередовании, которая позволит сопоставлять empt string.

Еще одна демка

0 голосов
/ 11 октября 2019

Если вы хотите сопоставить пустые или несколько параметров (как вы упомянули в одном из комментариев ), есть путь:

"^(|2|4|First|Fourth)$"

Это будет соответствовать empty, "2", "4", "First" or "Fourth".


Проблема с предложенным вами шаблоном состоит в том, что ? делает целую группу необязательной, поэтому она будет соответствовать чему угодно:).

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