Проверка регулярных выражений с разделенной двоеточием переменной длины - PullRequest
1 голос
/ 28 октября 2019

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

В настоящее время я использую это;

^([01ab])+(\:[01ab])*

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

Допустимые значения;

0

0:a

0:a:1

0:1:a:b

Недействительно

0:a:

0:a:1:b:

Ответы [ 3 ]

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

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

if (Regex.IsMatch(text, @"^[01ab](?::[01ab])*$")) 
{
    result = text.Split(':');
}

Регулярное выражение ^[01ab](?::[01ab])*$ соответствует началу строки с^, 0, 1, a или b, а затем 0 или более повторений : с последующими 0, 1, a или b изатем конец строки ($).

Если вы захотите немного поиграть с регулярным выражением, вы увидите, что C # позволяет получить доступ ко всем значениям группы захвата через CaptureCollection:

var text = "0:1:a:b";
var results = Regex.Match(text, @"^(?:([01ab])(?::\b|$))+$")?
        .Groups[1].Captures.Cast<Capture>().Select(c => c.Value);
Console.WriteLine(string.Join(", ", results)); // => 0, 1, a, b

См. Демонстрацию C # и демонстрацию regex .

Подробности регулярного выражения

  • ^- начало строки
  • (?:([01ab])(?::\b|$))+ - 1 или более повторений:
    • ([01ab]) - Группа 1: 0, 1, a или b
    • (?::\b|$) - либо :, за которым следуют буква, цифра (\b также позволит следовать _, но отсутствует в шаблоне), либо конец строки
  • $ - конец строки.
0 голосов
/ 28 октября 2019

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

bool Validate(string s)
{
    string[] valid = {"0", "1", "a", "b"};
    var splitArray = s.Split(':');

    if (splitArray.Length < 1 || splitArray.Length > 4)
          return false;

    return splitArray.All(a => valid.Contains(a));
}
0 голосов
/ 28 октября 2019

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication137
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] inputs = { "0", "0:a", "0:a:1", "0:1:a:b", "Not valid", "0:a:", "0:a:1:b:" };

            foreach (string input in inputs)
            {
                string[] splitArray = input.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries).ToArray();

                if (splitArray.Length < 2)
                {
                    Console.WriteLine("Input: '{0}' Not Valid", input);
                }
                else
                {
                    Console.WriteLine("Input: '{0}' First Value : '{1}', Last Value : '{2}'", input, splitArray[0], splitArray[splitArray.Length - 1]);
                }
            }
            Console.ReadLine();

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