Как я могу сделать регулярное выражение правильно проверить информацию? - PullRequest
0 голосов
/ 07 октября 2018

Мне дали задание создать текстовое поле, в котором вы вводите свой личный код (что мы используем в Латвии).Мне нужно, чтобы он был проверен перед сохранением информации.Для проверки я использовал Regex, но до сих пор не получил никакого результата.

Наш личный код выглядит так: XXYYZZ-ABCDE, где XXYYZZ - формат даты, как в DAYMONTHYEAR, а ABCDE - случайные числа.

        if (per_kods.Text.Trim() != string.Empty)
        {
            mRegxExpression = new Regex("${day}-${month}-${year}-#####$");

            if (!mRegxExpression.IsMatch(per_kods.Text.Trim()))
            {
                label7.Text = "";
            }
            else
            {
                label7.ForeColor = Color.Red;
                label7.Text = "Personas kods ievadīts nepareizi!";
                pareizi = false;
            }
        }

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

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

Вы можете получить помощь по приведенному ниже коду для проверки правильности.

public bool CheckValidation(string input)
    {
        input = input.Trim();
        if (input == string.Empty) return false;

        var mRegxExpression = new Regex("^([0-2][0-9]|(3)[0-1])(((0)[0-9])|((1)[0-2]))\\d{2}(\\-)\\d{5}$");
        return mRegxExpression.IsMatch(input);

    }
0 голосов
/ 07 октября 2018

Если вас не интересует проверка даты (например, будет принято 31 февраля, вы можете сделать

new Regex(@"^(0[1-9]|[1-2]\d|3[0-1])(0[1-9]|1[0-2])(\d{2})-(\d{5})$");

Если вы хотите понять, что означает эта строка, взгляните на ссылка на MSDN .

Теперь для проверки даты, поэтому, отфильтровывая даты, такие как 310298, которые не существуют, я бы порекомендовал сделать это вручную позже - регулярное выражение не лучший инструментдля такой логической проверки.

РЕДАКТИРОВАТЬ:

Это можно сделать с помощью DateTime.TryParse.

DateTime resultDateTime;

var isValid = DateTime.TryParse(string.Format("{0}-{1}-{2}", 2010, 2, 31), out resultDateTime);

// isValid is false, because 31st of February 2010 does not exist.

var isValid = DateTime.TryParse(string.Format("{0}-{1}-{2}", 2010, 2, 27), out resultDateTime);

// isValid is true, and resultDateTime has been set to 27-2-2010.

Обратите внимание, что DateTime.TryParse является чувствительным к культуре. В зависимости отцелевая культура, вам может потребоваться изменить строку ввода. См. Ссылка MSDN для TryParse.

EDIT2:

Итак, чтобы связать это с существующим кодом:

mRegxExpression = new Regex(@"^(0[1-9]|[1-2]\d|3[0-1])(0[1-9]|1[0-2])(\d{2})-(\d{5})$");

var match = mRegxExpression.Match(per_kods.Text.Trim()));

if(!Validate(match))
{
    // Handle invalid.
}
else
{
    // Handle valid.
}

Где Validate будет:

private static bool Validate(Match match)
{
    if(!match.Success)
    {
        return false;
    }

    var day = match.Groups[1].ToString();
    var month = match.Groups[2].ToString();
    var year = match.Groups[3].ToString();

    return DateTime.TryParse($"{day}-{month}-{year}", out _);
}

Поскольку наше регулярное выражение начинается с ^ и заканчивается $, всегда будет не более одного совпадения. Success свойство сообщает нам, было ли какое-либо совпадение, а позже свойство Groups дает намзахватывать группы.Groups[0] будет всей совпавшей строкой, а затем каждая следующая будет подстрокой, которая соответствует одной из скобок, заключенных в группы из регулярных выражений - поэтому первая - (0[1-9]|[1-2]\d|3[0-1]), которая представляет дни, вторая - месяцы и т. Д.на.Затем мы просто проверяем, является ли дата действительной (опять же, с учетом культуры!).Кроме того, мы можем аккуратно использовать синтаксис отбрасывания C # 7 (_) для параметра out, так как он нам не нужен.

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