Проблема синтаксического анализа регулярного выражения - PullRequest
1 голос
/ 29 февраля 2012

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

Input Sample (разделитель токена - ;, а внутри токена - любой символ, т.е.М / Ш / Д)

1W4;2W35;4M35;13W108

Ожидаемый результат

List<string> points = new List<string>() {"1W", "2W", "4M", "13W"};
List<int> intervals = new List<int>() {4, 35, 35, 108};

Спасибо за любую помощь.

Ответы [ 3 ]

7 голосов
/ 29 февраля 2012

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

var exp = new Regex(@"^(?<point>\d+[a-zA-Z])(?<interval>\d+)$");
var str = "1W4;2W35;4M35;13W108";
var tokens = str.Split(new char[] {';'}, StringSplitOptions.RemoveEmptyEntries);
foreach (var token in tokens)
{
    var match = exp.Match(token);
    if (match != null)
    {
        points.Add(match.Groups["point"].Value);
        intervals.Add(int.Parse(match.Groups["interval"].Value));
    }
}
1 голос
/ 29 февраля 2012

более ограничительное регулярное выражение может быть:

var regEx = new Regex("^([0-9]+[MWD])([0-9]+)$");

С группой 1 и 2 в качестве выходного:

var regEx = new Regex("^([0-9]+[MWD])([0-9]+)$");
var str = "1W4;2W35;4M35;13W108";
var vals = str.Split(';');
foreach (var v in vals)
{
    var match = regEx.Match(v);
    Console.WriteLine(match.Groups[1].Value);
    Console.WriteLine(match.Groups[2].Value);
}
0 голосов
/ 29 февраля 2012

Это довольно либеральное регулярное выражение в том смысле, что оно допустит различия во входных данных (например, его не волнует ;):

var points = new List<string>();
var intervals = new List<string>();

foreach (Match match in Regex.Matches(input, @"(\d+[MWD])(\d+)"))
{
    points.Add(match.Groups[1].Value);
    intervals.Add(match.Groups[2].Value);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...