разделить запятой, игнорируя определенные запятые C # - PullRequest
0 голосов
/ 16 мая 2018

У меня есть строка, которая выглядит следующим образом:

NULL VALUE, 25,000-30,000,31,000-32,000,33,000-50,000

Как я могу разделить это так, чтобы я получил:

NULL VALUE или 25 000-30 000 или 31 000-32 000 или 33 000-50 000

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

NULL VALUE
25
000-30
000
31
000-32
000
33
000-50
000

Я пробовал вот так Regex.Split(items[1], ",(?=(?:[^']*'[^']*')*[^']*$)"), но это не возвращает того, что мне нужно.

примечание от редактора: извлечено из комментариев

Если значение является тысячным значением, оно не должно делиться через запятую, если нет, то оно должно делиться через запятую, т.е. NULL VALUE,25,000-30,000 должно быть NULL VALUE | 25,000 - 30,000

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

На самом деле вам нужно определить диапазоны от A до B. A может быть любым числом от 0 до X, а B может быть любым числом от 0 до X.

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

1-10
1-10,000
1,000-10,000
1,000,000-2,000,000
NULL VALUE

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

Вы можете использовать это регулярное выражение: ([A-Z ]+|(?:\d{1,3}(?:,\d{3})*)-(?:\d{1,3}(?:,\d{3})*))это означает:

(
    [A-Z ]+#NULL VALUE
    |#OR
    (?:
       \d{1,3}#A trailling number
              (?:,\d{3})*#Followed or not by a thousand separator and 3 digits
    )
    -#The range separator
    (?:\d{1,3}(?:,\d{3})*)#Same thing here
)

В коде C # это дает:

var input = "NULL VALUE,25,000-30,000,31,000-32,000,33,000-50,000";

var regex = new Regex(@"(
                        [A-Z ]+#NULL VALUE
                        |#OR
                        (?:
                           \d{1,3}#A trailling number
                                  (?:,\d{3})*#Followed or not by a thousand separator and 3 digits
                        )
                        -#The range separator
                        (?:\d{1,3}(?:,\d{3})*)#Same thing here
                    )", RegexOptions.IgnorePatternWhitespace | RegexOptions.IgnoreCase | RegexOptions.Multiline);

var matches = regex.Matches(input);

foreach (Match match in matches)
{
    // Do what you want here, I choose to output it.
    Console.WriteLine(match.Groups[1]); 
}

Что выводит:

NULL VALUE

25,000-30 000

31 000-32 000

33 000-50 000

0 голосов
/ 16 мая 2018

Это такой кошмар, когда я пытаюсь разобрать, и вы, вероятно, никогда не получите его на 100% без ошибок. Если это вообще возможно, попытайтесь получить значения с правильным символом разделения.

static void Main(string[] args)
    {
        string x = "NULL VALUE,25,000-30,000,31,000-32,000,33,000-50,000";
        string regexstring = @"([A-Z]{1,} [A-Z]{1,}|\d{1,},\d{3}-\d{1,},\d{3}|\d{1,3}-\d{1,3}|\d{1,},\d{3}-\d{1,3}|\d{1,3}-\d{1,},\d{3})";
        var erg = Regex.Split(x, regexstring);
        foreach (var item in erg)
        {
            Console.WriteLine(item);
        }
    }

производит:

NULL VALUE
,
25,000-30,000
,
31,000-32,000
,
33,000-50,000

Это решение работает по крайней мере с вашими значениями теста. Вам нужно было бы удалить пустые строки и запятые, но хорошо, он правильно анализирует заданные значения.

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