Имя: Пароль:
1C
 
Регулярные Выражения 1С
0 IVLeontev
 
20.09.19
13:39
Добрый день.
Возникла сложность с регулярными выражениями 1с.
Есть строка: "MAIN"",""100002"",""RES"","""",""1,92".
Не могу понять, как её разбить на массив по шаблону "," - то есть мне нужно, чтобы в массив попали подстроки :MAIN, 100002, RES, (пустая строка), 1,92.
Пробовал использовать СтрРазделить(Строка, """,""",Истина), но в массив летит куча пустых кавычек.

Подскажите, пожалуйста, в каком направлении искать ответ, если эта задача разрешима.
1 Волшебник
 
20.09.19
13:41
сначала снеси все кавычки
стр = СтрЗаменить(стр, """", "");
2 trooba
 
20.09.19
13:43
(0) Во всех стандартных есть "РазложитьСтрокуВМассивПодстрок()"
3 unenu
 
20.09.19
13:44
(2) - это стандарты прошлого века, а тс уже живет в 21-м и безрезультатно использует системный аналог
СтрРазделить(Строка, """,""",Истина)
4 trooba
 
20.09.19
13:44
(0) // Разбивает строку на несколько строк по указанному разделителю. Разделитель может иметь любую длину.
// В случаях, когда разделителем является строка из одного символа, и не используется параметр СокращатьНепечатаемыеСимволы,
// рекомендуется использовать функцию платформы СтрРазделить.
//
// Параметры:
//  Значение               - Строка - текст с разделителями;
//  Разделитель            - Строка - разделитель строк текста, минимум 1 символ;
//  ПропускатьПустыеСтроки - Булево - признак необходимости включения в результат пустых строк.
//    Если параметр не задан, то функция работает в режиме совместимости со своей предыдущей версией:
//     - для разделителя-пробела пустые строки не включаются в результат, для остальных разделителей пустые строки
//       включаются в результат;
//     - если параметр Строка не содержит значащих символов или не содержит ни одного символа (пустая строка), то в
//       случае разделителя-пробела результатом функции будет массив, содержащий одно значение "" (пустая строка), а
//       при других разделителях результатом функции будет пустой массив.
//  СокращатьНепечатаемыеСимволы - Булево - сокращать непечатаемые символы по краям каждой из найденных подстрок.
//
// Возвращаемое значение:
//  Массив - массив строк.
//
// Пример:
//  СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(",один,,два,", ",")
//  - возвратит массив из 5 элементов, три из которых  - пустые: "", "один", "", "два", "";
//  СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(",один,,два,", ",", Истина)
//  - возвратит массив из двух элементов: "один", "два";
//  СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(" один   два  ", " ")
//  - возвратит массив из двух элементов: "один", "два";
//  СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок("")
//  - возвратит пустой массив;
//  СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок("",,Ложь)
//  - возвратит массив с одним элементом: ""(пустая строка);
//  СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок("", " ")
//  - возвратит массив с одним элементом: "" (пустая строка).
//
Функция РазложитьСтрокуВМассивПодстрок(Знач Значение, Знач Разделитель = ",", Знач ПропускатьПустыеСтроки = Неопределено,
    СокращатьНепечатаемыеСимволы = Ложь) Экспорт
    
    Если Разделитель = ","
        И ПропускатьПустыеСтроки = Неопределено
        И СокращатьНепечатаемыеСимволы Тогда
        
        Результат = СтрРазделить(Значение, ",", Ложь);
        Для Индекс = 0 По Результат.ВГраница() Цикл
            Результат[Индекс] = СокрЛП(Результат[Индекс])
        КонецЦикла;
        Возврат Результат;
        
    КонецЕсли;
    
    Результат = Новый Массив;
    
    // Для обеспечения обратной совместимости.
    Если ПропускатьПустыеСтроки = Неопределено Тогда
        ПропускатьПустыеСтроки = ?(Разделитель = " ", Истина, Ложь);
        Если ПустаяСтрока(Значение) Тогда
            Если Разделитель = " " Тогда
                Результат.Добавить("");
            КонецЕсли;
            Возврат Результат;
        КонецЕсли;
    КонецЕсли;
    //
    
    Позиция = СтрНайти(Значение, Разделитель);
    Пока Позиция > 0 Цикл
        Подстрока = Лев(Значение, Позиция - 1);
        Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Подстрока) Тогда
            Если СокращатьНепечатаемыеСимволы Тогда
                Результат.Добавить(СокрЛП(Подстрока));
            Иначе
                Результат.Добавить(Подстрока);
            КонецЕсли;
        КонецЕсли;
        Значение = Сред(Значение, Позиция + СтрДлина(Разделитель));
        Позиция = СтрНайти(Значение, Разделитель);
    КонецЦикла;
    
    Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Значение) Тогда
        Если СокращатьНепечатаемыеСимволы Тогда
            Результат.Добавить(СокрЛП(Значение));
        Иначе
            Результат.Добавить(Значение);
        КонецЕсли;
    КонецЕсли;
    
    Возврат Результат;
    
КонецФункции
5 trooba
 
20.09.19
13:46
(3) Ну, тоды, Ой.
6 unenu
 
20.09.19
13:47
(4) (5) не ой, а "Разделитель может иметь любую длину." в стандарте прошлого века, что может ему как раз на руку.
7 IVLeontev
 
20.09.19
13:49
Спасибо, сейчас буду пробовать.
8 trooba
 
20.09.19
13:51
(6) Откуда знаешь? В 1 кабинете сидите?
9 IVLeontev
 
20.09.19
14:32
РазложитьСтрокуВМассивПодстрок помогла, спасибо еще раз.
10 sikuda
 
20.09.19
15:23
(9) Вот не надо боли - " с регулярными выражениями 1с". В 1С нет регулярных выражений или они прикручиваются вручную RegExp = Новый COMОбъект("VBScript.RegExp");

Называйте вещи своими именами - функции работы со строками!