Помогите написать регулярное выражение
От: csharpworker  
Дата: 20.07.09 14:07
Оценка:
Стыдно, конечно, так нагло просить уважаемое сообщество, но я не имею огромного опыта в регулярках. Ежели кто забредет ГУРУ в регулярке и ему это не доставит особых хлопот буду очень признателен.
Есть строка (несколько килобайт) в котрой последовательно идут описания товаров.
Описание товара имеет вид такой (3 товара)
"вот тут чтото про товар", "и тут тоже", 2, 45, "а вот тут, вот так, и эдак",
"вот тут чтото про товар", "и тут тоже", 3, 41, "а вот тут, вот так, и эдак",
"вот тут чтото про товар", "и тут тоже", 5, 45, "а вот тут, вот так, и эдак",

т.е. разделение запятыми не учитывать тех запятых которые в кавычках.

Как мне такую строку разбить на массив строк типа
"вот тут чтото про товар", "и тут тоже", 5, 45, "а вот тут, вот так, и эдак"

Количество элементов характеризирующих товар четко определено, в примере выше их 5.

Заранее спасибо!
Re: Помогите написать регулярное выражение
От: Пельмешко Россия blog
Дата: 20.07.09 14:11
Оценка:
Здравствуйте, csharpworker, Вы писали:

C>"вот тут чтото про товар", "и тут тоже", 5, 45, "а вот тут, вот так, и эдак",


Не хватает информации
В строковых литералах могут встретиться ", как Вы их эскейпите?
Re[2]: Помогите написать регулярное выражение
От: csharpworker  
Дата: 20.07.09 14:33
Оценка:
Здравствуйте, Пельмешко, Вы писали:

П>Здравствуйте, csharpworker, Вы писали:


C>>"вот тут чтото про товар", "и тут тоже", 5, 45, "а вот тут, вот так, и эдак",


П>Не хватает информации

П>В строковых литералах могут встретиться ", как Вы их эскейпите?
Нет кавычки только так:
"вот тут чтото про товар"

внутри кавычек быть не может.
Re: Помогите написать регулярное выражение
От: kvl_mikki Россия  
Дата: 20.07.09 14:51
Оценка:
Здравствуйте, csharpworker, Вы писали:

C>Стыдно, конечно, так нагло просить уважаемое сообщество, но я не имею огромного опыта в регулярках. Ежели кто забредет ГУРУ в регулярке и ему это не доставит особых хлопот буду очень признателен.

C>Есть строка (несколько килобайт) в котрой последовательно идут описания товаров.
C>Описание товара имеет вид такой (3 товара)
C>"вот тут чтото про товар", "и тут тоже", 2, 45, "а вот тут, вот так, и эдак",
C>"вот тут чтото про товар", "и тут тоже", 3, 41, "а вот тут, вот так, и эдак",
C>"вот тут чтото про товар", "и тут тоже", 5, 45, "а вот тут, вот так, и эдак",

C>т.е. разделение запятыми не учитывать тех запятых которые в кавычках.


C>Как мне такую строку разбить на массив строк типа

C>"вот тут чтото про товар", "и тут тоже", 5, 45, "а вот тут, вот так, и эдак"

C>Количество элементов характеризирующих товар четко определено, в примере выше их 5.


Это ж csv обычный. куча парсеров к нему есть- без регулярный выражений все разбирается.
... << RSDN@Home 1.2.0 alpha 4 rev. 1089>>
Re: Помогите написать регулярное выражение
От: akasoft Россия  
Дата: 20.07.09 17:12
Оценка:
Здравствуйте, csharpworker, Вы писали:

C>Как мне такую строку разбить на массив строк типа


Как-то так, только разделитель поменять на "," и лишнее убрать:

    public static class BlaBlaUtil
    {
        private static string separator = ";";
        private static string pattern = string.Format(@"{0}(?=(?:[^""]*""[^""]*"")*(?![^""]*""))", separator);

        public static List<BlaBlaItem> LoadFromCsv(string fileName)
        {
            if (!File.Exists(fileName))
                throw new FileNotFoundException("Файл не найден", fileName);

            var result = new List<BlaBlaItem>();

            var line = 0; // считаем строки, для вменяемого сообщения об ошибке в строке

            using (StreamReader reader = new StreamReader(fileName, Encoding.GetEncoding(1251)))
                while (!reader.EndOfStream)
                {
                    line++;
                    var s = reader.ReadLine();

                    // Пропускаем первую строку с заголовками
                    if (line == 1)
                        continue;
                    //
                    string[] parts = Regex.Split(s, pattern);

                    var item = new BlaBlaItem();
                    item.bla1 = parts[0];
                    item.bla2 = int.Parse(parts[1]);
                    ...
                    result.Add(item);
                }

            return result;
        }
... << RSDN@Home 1.2.0 alpha 4 rev. 1238>> SQL Express 2005
Re: Помогите написать регулярное выражение
От: Caracrist https://1pwd.org/
Дата: 20.07.09 19:11
Оценка:
Здравствуйте, csharpworker, Вы писали:

C>Стыдно, конечно, так нагло просить уважаемое сообщество, но я не имею огромного опыта в регулярках. Ежели кто забредет ГУРУ в регулярке и ему это не доставит особых хлопот буду очень признателен.

C>Есть строка (несколько килобайт) в котрой последовательно идут описания товаров.
C>Описание товара имеет вид такой (3 товара)
C>"вот тут чтото про товар", "и тут тоже", 2, 45, "а вот тут, вот так, и эдак",
C>"вот тут чтото про товар", "и тут тоже", 3, 41, "а вот тут, вот так, и эдак",
C>"вот тут чтото про товар", "и тут тоже", 5, 45, "а вот тут, вот так, и эдак",

C>т.е. разделение запятыми не учитывать тех запятых которые в кавычках.


C>Как мне такую строку разбить на массив строк типа

C>"вот тут чтото про товар", "и тут тоже", 5, 45, "а вот тут, вот так, и эдак"

C>Количество элементов характеризирующих товар четко определено, в примере выше их 5.


C>Заранее спасибо!



  string input = "\"вот тут чтото про товар\", \"и тут тоже\", 2, 45, \"а вот тут, вот так, и эдак\",";
  string pattern = @"(^|,)[^"",]*(""[^""]+""|[^,""]+)";
  for(Match m = Regex.Match(input,pattern ); m.Groups.Count == 3;m = m.NextMatch())
  {
       Group g = m.Groups[2];
       // do your work on g
  }
~~~~~
~lol~~
~~~ Single Password Solution
Re[2]: Помогите написать регулярное выражение
От: Caracrist https://1pwd.org/
Дата: 20.07.09 19:14
Оценка:
C>
C>  string input = "\"вот тут чтото про товар\", \"и тут тоже\", 2, 45, \"а вот тут, вот так, и эдак\",";
C>  //string pattern = @"(^|,)[^"",]*(""[^""]+""|[^,""]+)";
    string pattern = @"(^|,)\s*(""[^""]+""|[^,""]+)";
C>  for(Match m = Regex.Match(input,pattern ); m.Groups.Count == 3;m = m.NextMatch())
C>  {
C>       Group g = m.Groups[2];
C>       // do your work on g
C>  }
C>
~~~~~
~lol~~
~~~ Single Password Solution
Re[2]: Помогите написать регулярное выражение
От: csharpworker  
Дата: 21.07.09 11:08
Оценка:
Здравствуйте, Пельмешко, Вы писали:

П>В строковых литералах могут встретиться ", как Вы их эскейпите?


Таки да! Встретились!
И как быть? Они идут ввиде "" — две двойных кавычки.
Re[3]: Помогите написать регулярное выражение
От: Caracrist https://1pwd.org/
Дата: 21.07.09 11:46
Оценка:
Здравствуйте, csharpworker, Вы писали:

C>Здравствуйте, Пельмешко, Вы писали:


П>>В строковых литералах могут встретиться ", как Вы их эскейпите?


C>Таки да! Встретились!

C>И как быть? Они идут ввиде "" — две двойных кавычки.

то что я написал там, http://www.rsdn.ru/forum/dotnet/3475332.1.aspx
Автор: Caracrist
Дата: 20.07.09


заменить патерн и группа другая...
string pattern = @"(^|,)\s*(""([^""]|"""")+""|[^,]+)"
~~~~~
~lol~~
~~~ Single Password Solution
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.