J'ai une chaîne comme:
"super exemple of string key : text I want to keep - end of my string"
Je veux juste garder la chaîne qui est entre "key : "
et " - "
. Comment puis je faire ça? Dois-je utiliser un Regex ou puis-je le faire d'une autre manière?
substring
etindexof
Réponses:
Peut-être qu'un bon moyen est simplement de couper une sous - chaîne :
la source
ou avec juste des opérations de chaîne
la source
Vous pouvez le faire sans regex
la source
En fonction de la robustesse / flexibilité de votre implémentation, cela peut en fait être un peu délicat. Voici l'implémentation que j'utilise:
la source
InvariantCulture
ne fonctionne pas avec les applications universelles Windows. Existe-t-il un moyen de le supprimer en conservant les fonctionnalités de votre classe? @ChaseMedallionVoici comment je peux faire ça
la source
Je pense que cela fonctionne:
la source
Regex est exagéré ici.
Vous pouvez utiliser
string.Split
avec la surcharge qui prend unstring[]
pour les délimiteurs, mais ce serait également exagéré.Regardez
Substring
etIndexOf
- le premier pour obtenir des parties d'une chaîne donnée et un index et une longueur et le second pour trouver indexé des chaînes / caractères internes.la source
string.Split
.Une solution LINQ fonctionnelle:
la source
la source
Puisque le
:
et le-
sont uniques, vous pouvez utiliser:la source
ou, avec une regex.
avec un exemple courant .
Vous pouvez décider si c'est exagéré.
ou
comme méthode d'extension sous-validée
la source
Ceci renvoie uniquement la ou les valeurs entre "key:" et l'occurrence suivante de "-"
la source
Vous pouvez utiliser la méthode d'extension ci-dessous:
L'utilisation est:
la source
J'ai utilisé l'extrait de code de Vijay Singh Rana qui fait essentiellement le travail. Mais cela pose des problèmes si le
firstString
contient déjà le fichierlastString
. Ce que je voulais, c'était extraire un access_token d'une réponse JSON (aucun analyseur JSON chargé). MonfirstString
était\"access_token\": \"
et monlastString
était\"
. J'ai fini avec une petite modificationla source
Si vous recherchez une solution 1 ligne, c'est celle-ci:
La solution complète en 1 ligne, avec
System.Linq
:la source
Vous avez déjà de bonnes réponses et je me rends compte que le code que je fournis est loin d'être le plus efficace et le plus propre. Cependant, j'ai pensé que cela pourrait être utile à des fins éducatives. Nous pouvons utiliser des classes et des bibliothèques pré-construites toute la journée. Mais sans comprendre le fonctionnement interne, nous imitons et répétons simplement et n'apprendrons jamais rien. Ce code fonctionne et est plus basique ou «vierge» que certains des autres:
Vous vous retrouvez avec la chaîne souhaitée affectée à la variable parsedString. Gardez à l'esprit qu'il capturera également les espaces précédents et précédents. N'oubliez pas qu'une chaîne est simplement un tableau de caractères qui peut être manipulé comme d'autres tableaux avec des indices, etc.
Prends soin de toi.
la source
Si vous souhaitez gérer plusieurs occurrences de paires de sous-chaînes, ce ne sera pas facile sans RegEx:
Si l'ordre et le nombre d'occurrences des sous-chaînes n'ont pas d'importance, celui-ci rapide et sale peut être une option:
Au moins, il évite la plupart des exceptions, en renvoyant la chaîne d'origine si aucune / seule sous-chaîne ne correspond.
la source
Comme je le dis toujours, rien n'est impossible:
J'espère que j'ai aidé.
la source
Quelque chose comme ça peut-être
la source
Lorsque les questions sont formulées à partir d'un seul exemple, des ambiguïtés sont inévitablement présentes. Cette question ne fait pas exception.
Pour l'exemple donné dans la question, la chaîne souhaitée est claire:
Cependant, cette chaîne n'est qu'un exemple de chaînes et de chaînes de limite pour lesquelles certaines sous-chaînes doivent être identifiées. Je considérerai une chaîne générique avec des chaînes de limite génériques, représentées comme suit.
PP
est la chaîne précédente ,FF
est la chaîne suivante et les chapeaux de partie indiquent quelles sous-chaînes doivent être mises en correspondance. (Dans l'exemple donné dans la questionkey :
est la chaîne précédente et-
est la chaîne suivante.) J'ai supposé quePP
etFF
sont précédés et suivis par des limites de mot (de sorte quePPA
etFF8
ne correspondent pas).Mes hypothèses, telles que reflétées par les chapeaux de fête, sont les suivantes:
PP
- chaîne peut être précédée d'une (ou plusieurs)FF
sous-chaînes qui, si elles sont présentes, ne sont pas prises en compte;PP
est suivi d'un ou plusieursPP
s avant deFF
rencontrer, lesPP
s suivants font partie de la sous-chaîne entre les chaînes précédente et suivante;PP
est suivi d'un ou de plusieursFF
s avant laPP
rencontre d'un, le premierFF
suivantPP
est considéré comme la chaîne suivante.Notez que la plupart des réponses ici ne traitent que des chaînes du formulaire
ou
On peut utiliser une expression régulière, des constructions de code ou une combinaison des deux pour identifier les sous-chaînes d'intérêt. Je ne porte aucun jugement sur la meilleure approche. Je ne présenterai que l'expression régulière suivante qui correspondra aux sous-chaînes d'intérêt.
Démarrez votre moteur! 1
J'ai testé cela avec le moteur de regex PCRE (PHP), mais comme le regex n'est pas du tout exotique, je suis sûr qu'il fonctionnera avec le moteur de regex .NET (qui est très robuste).
Le moteur regex effectue les opérations suivantes:
Cette technique, consistant à faire correspondre un caractère à la fois, en suivant la chaîne précédente, jusqu'à ce que le caractère soit
F
et soit suivi parF
(ou plus généralement, le caractère étant la chaîne qui constitue la chaîne suivante), est appelée Solution de jeton gourmand tempéré .Naturellement, l'expression rationnelle devrait être modifiée (si possible) si les hypothèses que j'ai énoncées ci-dessus sont modifiées.
1. Déplacez le curseur pour des explications détaillées.
la source
Dans C # 8.0 et supérieur, vous pouvez utiliser l'opérateur de plage
..
comme dansConsultez la documentation pour plus de détails.
la source