Je travaille avec des cordes massives qui nécessitent beaucoup de manipulation.
Par exemple, je pourrais générer une chaîne comme celle-ci:
Partie 1
BateauSection A
ProgrammationPartie 2
Partitionnement des bateaux pour la programmation.Section AA
Section SQL Entrées.
La chaîne serait trop grande pour en vérifier manuellement chaque partie. Maintenant, j'ai besoin de split
cela string
en stringlist
sections et en parties. Je peux penser à deux options:
Une expression régulière:
QStringList sl = s.split(QRegularExpression("\n(?=Part [0-9]+|Section [A-Z]+)"));
Il semble que cela devrait fonctionner, mais parfois les exceptions passent (IE: Section SQL Entries
serait divisé par erreur)
Sinon, ce que je pourrais faire est de placer un marqueur lorsque je génère la chaîne initiale:
🚤💻 Partie 1
Bateau🚤💻
Programmation de la section A🚤💻Partie 2
Partitionnement des bateaux pour la programmation.🚤💻Section AA
Section SQL Entrées.
Ce qui signifie que le fractionnement de la chaîne deviendrait facile:
QStringList sl = s.split("🚤💻"));
Quelque chose me dit cependant que ni l'un ni l'autre n'est un bon style ou une bonne pratique de programmation, mais jusqu'à présent, je n'en ai pas discuté ni trouvé d'alternative.
- Si vous étiez mon chef de projet, accepteriez-vous l'une de ces méthodes?
- Sinon, que suggéreriez-vous que je fasse comme meilleure pratique?
Réponses:
Ce n'est pas une mauvaise pratique que l'encodage de documents soit incorporé sous forme de texte dans une chaîne. Pensez au démarque, HTML, XML, JSON, YAML, LaTeX, etc.
Ce qui est une mauvaise pratique, c'est de réinventer la roue. Plutôt que d'écrire votre propre processeur de texte, pensez à utiliser une norme existante. Il existe de nombreux logiciels gratuits qui effectuent une grande partie de l'analyse pour vous, et beaucoup ont une licence non restrictive qui vous permet d'utiliser ledit logiciel dans votre propre logiciel propriétaire.
la source
L'utilisation d'un séparateur commun devrait fonctionner correctement lors du fractionnement de chaînes arbitraires plus grandes, mais je déconseille d'utiliser un symbole arbitraire. Quelqu'un qui lit cette chaîne en texte brut peut être confondu, sans parler des problèmes avec UTF et si le symbole apparaît ou non à l'intérieur des sections.
La partie la plus importante de cela est que chaque section reste intacte, tandis que chaque "en-tête de section" doit être identifié de manière appropriée.
Pourquoi ne pas utiliser un séparateur commun mais le garder lisible? Quelque chose comme:
Le problème est de décider ce que le séparateur doit être, car il doit être quelque chose qui est garanti pour ne pas afficher de section. Vous pouvez l'identifier en tant que séparateur en exigeant qu'il se trouve au début d'une ligne et le seul texte de cette ligne .
Sans autre connaissance du texte attendu dans chaque section, il est difficile de faire une recommandation sur le séparateur commun qui serait le mieux dans ce cas.
la source
La réponse acceptée semble avoir raté ce que vous avez écrit dans un commentaire:
et a donné ceci comme exemple:
Si c'est ce que vous voulez, c'est à mon humble avis une très mauvaise idée d'utiliser un "markdown" ou un séparateur textuel pour toute votre chaîne, cela a toujours un certain risque d'interférer avec la manipulation et ne conduira pas à un code robuste. Surtout lorsque vous essayez de commencer à utiliser des expressions régulières sur une telle chaîne combinée, vous rencontrerez probablement les mêmes problèmes que ceux rencontrés lors de l'analyse de HTLM ou XML avec des expressions régulières .
Surtout parce que vous avez écrit qu'il pourrait y avoir "des milliers de fonctions [de manipulation]", ce risque pourrait devenir un vrai problème. Même si vous utilisez une démarque comme XML pour stocker la liste de chaînes en interne, vous devez vous assurer que la manipulation ne traitera que le contenu, pas la démarque, ce qui signifierait de diviser la chaîne en parties avant d'effectuer tout traitement et de rejoindre après cela à nouveau - de sorte que cela aura un risque élevé de vous donner une mauvaise performance.
La meilleure alternative de conception ici est de fournir un type de données abstrait (utilisez une classe si vous le souhaitez), de l'appeler
MyStringList
et de fournir un petit ensemble d'opérations de base qui vous permettent d'implémenter vos "milliers de fonctions" en termes de ces opérations. Par exemple, il peut y avoir des opérations génériquesfind
etreplace
ou unemap
opération fonctionnelle générique . Vous pouvez également ajouter quelque chose comme uneJoinToString
opération si vous avez vraiment besoin de toute la liste dans une chaîne pour certains purporses.En utilisant ces opérations, votre crainte que le code ne devienne plus compliqué parce que "tout devrait être fait dans une boucle for" devient inutile, car les seules
for
boucles que vous obtenez sont encapsulées dans les opérations du type de données. Et je ne serais pas préoccupé par les performances jusqu'à ce que vous ayez un impact réel et mesurable sur les performances (que je doute que vous obteniez si vous implémentez correctement les opérations de base).la source
<
et>
, et il saisira chaque instance de cette chaîne où je pourrai facilement supprimer les instances dont je ne veux pas, et les manipuler proprement de la manière que je veux. C'est bien parce que les expressions régulières seules ne gèrent pas les sous-chaînes comme ceci:<boat <programming>>
bien là où il y a plusieurs couches de crochets.Le format décrit est très similaire aux fichiers INI:
https://en.wikipedia.org/wiki/INI_file
Dans ce cas, la section est entourée de crochets [], donc ce que vous décrivez a du sens en marquant la section d'une certaine manière pour ajouter une signification supplémentaire à ce texte.
la source
Question: A partir de quoi "générez-vous" cette chaîne?
Serait- ce plus facile à manipuler?
la source
LaTeX
à l'SSML
interprète, et l'un des problèmes est que vous pouvez générer des images identiques avec un code très différent, et il est donc presque impossible d'être cohérent si l'utilisateur choisit des moyens médiocres ou ésotériques de générer ses formules. Tout cela signifie en fin de compte que les personnes qui n'utilisent pas de bonnes pratiques n'auront pas une interprétation décente de leurs scripts.