Регулярное выражение не соответствует формату строки в C # - PullRequest
4 голосов
/ 12 октября 2019

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

число, число, число, число -> 1200,2500,6500,90

Я использую регулярное выражение, как это

Regex.IsMatch(s, @"^[0-4095]\,[0-4095]\,[0-4095]\,[0-4095]$")

с использованием 4095, поскольку диапазон номеров находится в диапазоне от 0 до 4095. Нужна помощь в этом. Заранее спасибо.

Ответы [ 3 ]

5 голосов
/ 12 октября 2019

Вы можете сделать это без необходимости использовать регулярные выражения с помощью простого выражения LINQ и метода int.TryParse:

  var sections = e.Split(',');
  sections.Count() == 4 && 
  sections.All(s => int.TryParse(s, out int i) && i >= 0 && i <= 4095);
2 голосов
/ 12 октября 2019

Возможно,

^(?:40\d[0-5]|[1-3]\d{3}|\d{1,3}),(?:40\d[0-5]|[1-3]\d{3}|\d{1,3}),(?:40\d[0-5]|[1-3]\d{3}|\d{1,3}),(?:40\d[0-5]|[1-3]\d{3}|\d{1,3})$

Демонстрация 1

может работать нормально, если 000,000,000,000 будет действительным, в противном случае,

^(?:(?:40\d[0-5]|[1-3]\d{3}|[1-9]\d{2}|[1-9]\d|\d),){3}(?:40\d[0-5]|[1-3]\d{3}|[1-9]\d{2}|[1-9]\d|\d)$

может быть вариант.

Демонстрация 2

Тест

using System;
using System.Text.RegularExpressions;

public class Example
{
    public static void Main()
    {
        string pattern = @"^(?:(?:40\d[0-5]|[1-3]\d{3}|[1-9]\d{2}|[1-9]\d|\d),){3}(?:40\d[0-5]|[1-3]\d{3}|[1-9]\d{2}|[1-9]\d|\d)$";
        string input = @"1200,2500,6500,90
            1200,2500,6500,90
            1200,2500,4095,90
            0,0,0,0
            999,1,0,99
            000,000,000,000
            4095,4095,4095,4095

            ";
        RegexOptions options = RegexOptions.Multiline;

        foreach (Match m in Regex.Matches(input, pattern, options))
        {
            Console.WriteLine("'{0}' found at index {1}.", m.Value, m.Index);
        }
    }
}

Если вы хотите упростить / изменить / изучить выражение, это объясняется вверхняя правая панель regex101.com . Если хотите, вы также можете посмотреть в эту ссылку , как она будет сопоставляться с некоторыми примерами ввода.


RegEx Circuit

jex.im визуализирует регулярные выражения:

enter image description here

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

Мы не можем делать диапазон на таких числах. Вы можете использовать это регулярное выражение в своем случае:

^(([0-9]|[0-9][0-9]|[0-9][0-9][0-9]|0[0-9][0-9][0-9]|1[0-9][0-9][0-9]|2[0-9][0-9][0-9]|3[0-9][0-9][0-9]|40[0-9][0-5]),){3}([0-9]|[0-9][0-9]|[0-9][0-9][0-9]|0[0-9][0-9][0-9]|1[0-9][0-9][0-9]|2[0-9][0-9][0-9]|3[0-9][0-9][0-9]|40[0-9][0-5])$

Отредактировано:

^(([0-9]{1,3}|0[0-9]{3}|1[0-9]{3}|2[0-9]{3}|3[0-9]{3}|40[0-9][0-5]),){3}([0-9]{1,3}|0[0-9]{3}|1[0-9]{3}|2[0-9]{3}|3[0-9]{3}|40[0-9][0-5])$

Или,

^(?:(?:\d{1,3}|[0-3]\d{3}|40\d[0-5]),){3}(?:\d{1,3}|[0-3]\d{3}|40\d[0-5])$

Полагаю, теперь вы понимаете эту идею. Чтобы проверить, находится ли число в диапазоне от 0 до 4095,

  • Число может быть однозначным 0-9
  • Это может быть двузначное число [0-9] [0-9]
  • Это может быть любой трехзначный номер [0-9] [0-9] [0-9]
  • Но для четырехзначного числа мы должны игнорировать все числабольше 4095,

    . Поэтому запрос должен быть длиннее обычного.

  • 1 [0-9] [0-9] [0-9] охватывает все 4-значные числа, начиная с 1.

...

  • 40 [0-9] [0-5] охватывает все числа между4000 и 4095
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...