Для разбора текстовой строки в массив по разделителю (или нескольким разделителям) приведём здесь несколько функций в различных реализациях. Функции получились следующие:
- Разбор строки в массив по разделителю без учёта пробелов
- Разбор строки в массив по разделителю с пробелами
- Разбор строки в массив по нескольким разделителям без учёта пробелов
- Разбор строки в массив по массиву разделителей с пробелами
- Разбор строки в массив по сложным разделителям (разделители имеют в своём составе несколько символов).
При этом последняя из представленных функций самая универсальная, все остальные — это её частные случаи. На вход эта функция принимает исходную строку, массив разделителей, признак учитывать ли пробелы и признак игнорировать ли пустые значения. На выходе получается структура из массива разобранных строк и массива последовательного прохождения разделителей. Это два независимых друг от друга массива.
Реализация всех этих функций на языке 1С будет следующая…
1. Функция «Разбор строки в массив по разделителю без учёта пробелов».
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | // Разбирает строку в массив подстрок по разделителю. // При этом пробелы между подстроками не учитываются. // // Параметры: // Стр - исходная строка; // СтрРазделитель - разделитель, по умолчанию ","; // ИгнорироватьПустые - игнорировать ли пустые места между разделителями. // // Возвращаемое значение: // Массив строк // Функция РазобратьСтрокуВМассивПоРазделителю(Знач Стр, СтрРазделитель = ",", ИгнорироватьПустые = Ложь) Экспорт Результат = Новый Массив; ВхождениеРазделителя = Найти(Стр, СтрРазделитель); Пока ВхождениеРазделителя <> 0 Цикл ЧастьДоРазделителя = СокрЛП(Лев(Стр, ВхождениеРазделителя - 1)); Если НЕ (ИгнорироватьПустые И ПустаяСтрока(ЧастьДоРазделителя)) Тогда Результат.Добавить(ЧастьДоРазделителя); КонецЕсли; Стр = СокрЛП(Сред(Стр, ВхождениеРазделителя + 1)); ВхождениеРазделителя = Найти(Стр, СтрРазделитель); КонецЦикла; Если НЕ (ИгнорироватьПустые И ПустаяСтрока(Стр)) Тогда Результат.Добавить(СокрЛП(Стр)); КонецЕсли; Возврат Результат; КонецФункции; |
2. Функция «Разбор строки в массив по разделителю с пробелами».
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | // Разбирает строку в массив подстрок по разделителю. // Учитываются пробелы между подстроками и пустые подстроки. // // Параметры: // Стр - исходная строка; // СтрРазделитель - разделитель, по умолчанию ","; // ИгнорироватьПустые - игнорировать ли пустые места между разделителями. // // Возвращаемое значение: // Массив строк // Функция РазобратьСтрокуВМассивПоРазделителюСПробелами(Знач Стр, СтрРазделитель = ",", ИгнорироватьПустые = Ложь) Экспорт Результат = Новый Массив; ВхождениеРазделителя = Найти(Стр, СтрРазделитель); Пока ВхождениеРазделителя <> 0 Цикл ЧастьДоРазделителя = Лев(Стр, ВхождениеРазделителя - 1); Если НЕ (ИгнорироватьПустые И ПустаяСтрока(ЧастьДоРазделителя)) Тогда Результат.Добавить(ЧастьДоРазделителя); КонецЕсли; Стр = Сред(Стр, ВхождениеРазделителя + 1); ВхождениеРазделителя = Найти(Стр, СтрРазделитель); КонецЦикла; Если НЕ (ИгнорироватьПустые И ПустаяСтрока(Стр)) Тогда Результат.Добавить(Стр); КонецЕсли; Возврат Результат; КонецФункции; |
3. Функция «Разбор строки в массив по нескольким разделителям без учёта пробелов».
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | // Разбирает строку в массив подстрок по разделителям. // При этом пробелы между подстроками не учитываются // при условии, что в разделителях тоже нет пробела. // // Параметры: // Стр - исходная строка; // МассивРазделителей - массив используемых разделителей; // ИгнорироватьПустые - игнорировать ли пустые места между разделителями. // // Возвращаемое значение: // Массив строк // Функция РазобратьСтрокуВМассивПоРазделителям(Знач Стр, МассивРазделителей, ИгнорироватьПустые = Ложь) Экспорт Результат = Неопределено; Если МассивРазделителей.Количество() > 0 Тогда ОсновнойРазделитель = МассивРазделителей[0]; Для Каждого Разделитель Из МассивРазделителей Цикл Стр = СтрЗаменить(Стр, Разделитель, ОсновнойРазделитель); КонецЦикла; Если ОсновнойРазделитель = " " Тогда Результат = РазобратьСтрокуВМассивПоРазделителюСПробелами(Стр, ОсновнойРазделитель, ИгнорироватьПустые); Иначе Результат = РазобратьСтрокуВМассивПоРазделителю(Стр, ОсновнойРазделитель, ИгнорироватьПустые); КонецЕсли; КонецЕсли; Возврат Результат; КонецФункции; |
4. Функция «Разбор строки в массив по массиву разделителей с пробелами».
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | // Разбирает строку в массив подстрок по разделителям. // При этом пробелы между подстроками не учитываются. // // Параметры: // Стр - исходная строка; // МассивРазделителей - массив используемых разделителей; // ИгнорироватьПустые - игнорировать ли пустые места между разделителями. // // Возвращаемое значение: // Массив строк // Функция РазобратьСтрокуВМассивПоРазделителямСПробелами(Знач Стр, МассивРазделителей, ИгнорироватьПустые = Ложь) Экспорт Результат = Неопределено; Если МассивРазделителей.Количество() > 0 Тогда ОсновнойРазделитель = МассивРазделителей[0]; Для Каждого Разделитель Из МассивРазделителей Цикл Стр = СтрЗаменить(Стр, Разделитель, ОсновнойРазделитель); КонецЦикла; Результат = РазобратьСтрокуВМассивПоРазделителюСПробелами(Стр, ОсновнойРазделитель, ИгнорироватьПустые); КонецЕсли; Возврат Результат; КонецФункции; |
5. Функция «Разбор строки в массив по сложным разделителям».
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | // Разбирает строку в массив подстрок по разделителям (в виде строки). // При этом пробелы между подстроками не учитываются. // // Параметры: // Стр - исходная строка; // МассивРазделителей - массив используемых разделителей; // УчитыватьПробелы - учитывать ли пробелы между разделителями; // ИгнорироватьПустые - игнорировать ли пустые места между разделителями. // // Возвращаемое значение: // Структура строк и разделителей // Функция РазобратьСтрокуПоРазделителям(Знач Стр, МассивРазделителей, УчитыватьПробелы = Ложь, ИгнорироватьПустые = Ложь) Экспорт Результат = Новый Структура; ПоследовательностьЗначений = Неопределено; ПоследовательностьРазделителей = Неопределено; Если МассивРазделителей.Количество() > 0 Тогда ПоследовательностьЗначений = Новый Массив; ПоследовательностьРазделителей = Новый Массив; Позиция = СтрДлина(Стр); Пока Позиция > 0 Цикл //Нахождение минимальной позиции разделителя Позиция = 0; ТекущийРазделитель = Неопределено; Для Каждого Разделитель Из МассивРазделителей Цикл ПозицияРазделителя = Найти(Стр, Разделитель); Если ПозицияРазделителя <> 0 И (ПозицияРазделителя < Позиция ИЛИ Позиция = 0) Тогда Позиция = ПозицияРазделителя; ТекущийРазделитель = Разделитель; КонецЕсли; КонецЦикла; //Формирование последовательностей Если Позиция > 0 Тогда Значение = ?(УчитыватьПробелы, Сред(Стр, 1, Позиция-1), СокрЛП(Сред(Стр, 1, Позиция-1))); Если НЕ ИгнорироватьПустые ИЛИ НЕ ПустаяСтрока(Значение) Тогда ПоследовательностьЗначений.Добавить(Значение); КонецЕсли; ПоследовательностьРазделителей.Добавить(ТекущийРазделитель); Стр = Сред(Стр, Позиция + СтрДлина(ТекущийРазделитель)); Иначе Значение = ?(УчитыватьПробелы, Стр, СокрЛП(Стр)); Если НЕ ИгнорироватьПустые ИЛИ НЕ ПустаяСтрока(Значение) Тогда ПоследовательностьЗначений.Добавить(Значение); КонецЕсли; КонецЕсли; КонецЦикла; КонецЕсли; Результат.Вставить("МассивЗначений", ПоследовательностьЗначений); Результат.Вставить("МассивРазделителей", ПоследовательностьРазделителей); Возврат Результат; КонецФункции; |
Свежие комментарии