Я предлагаю двухэтапный подход: проверьте формат с помощью регулярного выражения, а затем разделите строку на :
, если она соответствует:
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
также позволит следовать _
, но отсутствует в шаблоне), либо конец строки
$
- конец строки.