Я работаю с массивными струнами, которые требуют много манипуляций.
Например, я мог бы сгенерировать такую строку:
Часть 1
ЛодкаРаздел А
ПрограммированиеЧасть 2
Разбиение лодок для программирования.Раздел AA
Раздел SQL Записи.
Строка будет слишком большой, чтобы вручную проверять каждую ее часть. Теперь мне нужно split
это string
разделить stringlist
на части и части. Я могу придумать два варианта:
Регулярное выражение:
QStringList sl = s.split(QRegularExpression("\n(?=Part [0-9]+|Section [A-Z]+)"));
Похоже, что это должно работать, но иногда исключения проскальзывают (IE: Section SQL Entries
ошибочно разделится)
В противном случае, я мог бы поместить маркер, когда я генерирую исходную строку:
BoatЧасть 1
ЛодкаРаздел A
Программирование2Часть 2 Разделительная
лодка для программирования.AAСекция AA
Раздел SQL Записи.
Что означает, что разделение строки станет простым:
QStringList sl = s.split("🚤💻"));
Что-то подсказывает мне, что ни один из них не является хорошим стилем или практикой программирования, но я до этого момента не обсуждал это и не нашел альтернативы.
- Если бы вы были моим руководителем проекта, вы бы приняли любой из этих методов?
- Если нет, что бы вы посоветовали мне сделать в качестве лучшей практики?
Ответы:
Неплохая практика - вставлять кодировку документа в виде текста в строку. Подумайте об уценке, HTML, XML, JSON, YAML, LaTeX и т. Д.
Плохая практика - это изобретать велосипед. Вместо того, чтобы писать собственный текстовый процессор, подумайте об использовании существующего стандарта. Существует множество бесплатных программ, которые выполняют большую часть анализа за вас, и многие из них имеют неограничительную лицензию, которая позволяет использовать указанное программное обеспечение в ваших собственных проприетарных программах.
источник
Используя некоторые общего разделителя должно работать нормально при разбиении произвольных строк большего размера, но я бы рекомендовал не использовать произвольный символ. Кто-то, читающий эту строку как открытый текст, может быть сбит с толку, не говоря уже о проблемах с UTF и о том, появляется ли символ внутри разделов или нет.
Наиболее важной частью этого является то, что каждый раздел остается неизменным, в то время как каждый «заголовок раздела» должен быть соответствующим образом идентифицирован.
Почему бы не использовать общий разделитель, но оставить его читаемым? Что-то вроде:
Проблема состоит в том, чтобы решить, каким должен быть разделитель , поскольку он должен быть чем-то, что гарантированно не будет отображаться ни в одном разделе. Вы могли бы далее идентифицировать это как разделитель , требуя, чтобы это было в начале строки и единственного текста в этой строке .
Без дальнейшего знания того, какой текст ожидается в каждом разделе, трудно дать рекомендацию о том, какой общий разделитель будет лучшим в этом случае.
источник
Принятый ответ, кажется, пропустил то, что вы написали в комментарии:
и привел это в качестве примера:
Если это именно то, что вам нужно, имхо очень плохая идея использовать некоторую «разметку» или текстовый разделитель для всей вашей строки, это всегда имеет определенный риск помешать манипуляциям и не приведет к надежному коду. Особенно, когда вы пытаетесь начать использовать регулярные выражения для такой объединенной строки, вы, вероятно, столкнетесь с теми же проблемами, с которыми люди сталкивались при попытке проанализировать HTLM или XML с регулярными выражениями. .
Тем более, что вы написали, что могут быть «тысячи [таких манипуляций] функций», этот риск может стать реальной проблемой. Даже если вы используете некоторую разметку, такую как XML, для внутреннего хранения списка строк, вам необходимо убедиться, что манипуляции будут обрабатывать только содержимое, а не разметку, так что это будет означать разделение строки на части перед выполнением какой-либо обработки и присоединение. это потом снова - так что это будет иметь высокий риск плохой работы.
Лучшей альтернативой дизайна здесь является предоставление абстрактного типа данных (если хотите, используйте класс), давайте вызовем его
MyStringList
и предоставим небольшой набор базовых операций, которые позволят вам реализовать «тысячи функций» в терминах этих операций. Например, это могут быть общие операцииfind
иreplace
операции или общая функциональнаяmap
операция . Вы также можете добавить что-то вродеJoinToString
операции, если вам действительно нужен весь список в одной строке для определенных целей.Используя эти операции, ваш страх, что код становится более сложным, потому что «все должно быть сделано в цикле for», становится бессмысленным, потому что единственные
for
циклы, которые вы получаете, инкапсулированы внутри операций типа данных. И я не буду беспокоиться о производительности до тех пор, пока вы не окажете реальное, измеримое влияние на производительность (что, я сомневаюсь, вы получите, если будете правильно выполнять основные операции).источник
<
и>
, и он будет захватывать каждый экземпляр этой строки, где я могу легко удалить ненужные экземпляры, и чисто манипулировать им так, как я хочу. Это хорошо, потому что регулярные выражения сами по себе не обрабатывают подстроки, как это:<boat <programming>>
хорошо, когда есть несколько слоев скобок.Описанный формат очень похож на INI-файлы:
https://en.wikipedia.org/wiki/INI_file
В этом случае раздел заключен в квадратные скобки [], поэтому то, что вы описываете, имеет смысл, пометив раздел таким образом, чтобы добавить дополнительный смысл этому тексту.
источник
Вопрос: Из чего вы «генерируете» эту строку?
Будет , что будет легче манипулировать?
источник
LaTeX
дляSSML
переводчика, и один из вопросов является то , что вы можете создать идентичные изображения с абсолютно другим кодом, и поэтому почти невозможно быть последовательным , если пользователь выбирает бедный или эзотерические способы получения его формулы. В конце концов, все это означает, что люди, не пользующиеся хорошей практикой, не получат достойной интерпретации своих сценариев.