8
votes

Aider à manipuler des cordes

Mes chaînes sont de ce genre: Ville (PR) Dans une base de données, où PR représente la province.

à la fin, je veux deux variables distinctes. Ville et pr.

Je dois le faire avec C #. Une idée? Merci.


0 commentaires

8 Réponses :


10
votes

regex?

Vous pouvez diviser votre modèle en Capturer des groupes et Allez de là. P>

(.*)(\(.*\))


4 commentaires

Je suis noob avec des expressions régulières, pouvez-vous mieux l'expliquer? Merci.


Ne devriez-vous pas échapper aux parens extérieurs afin que le groupe de capture ne soit que "PR", pas "(PR)"?


Pour être une comparaison équitable de la solution excellente de @ DTB, cela devrait être codé. Sa brièveté est convaincante maintenant mais je suis curieux si ça va tenir


Cette solution est trop simple mais bonne à titre d'exemple. Voir Stackoverflow.com/questions/2874442/ ... pour une meilleure solution.



14
votes

En supposant que les villes ne contiennent pas ( caractères: xxx

la ville est la sous-chaîne du premier caractère jusqu'à mais non le dernier ( caractère.
Province est la sous-chaîne du premier caractère après le dernier ( à la fin, à l'exclusion du dernier caractère.


2 commentaires

+1 Nice et propre, et gère mieux les noms de la ville; pourrait envisager d'utiliser lastIndexof pour le faire encore plus robuste


Vous devriez utiliser Regex, comme Madgnome suggéré



1
votes

Si la province est toujours entre parenthèses et que le nom de la ville n'aura aucune parenthèse, vous pouvez utiliser la fonction Split.

string foo = "City (PR)";
string[] bar = foo.Split('(');


2 commentaires

Cela devrait fonctionner, même si je dois supprimer les dernières parenthèses de PR avec une sous-chaîne.


Pourrait probablement se déplacer autour de ceci avec chaîne [] bar = foo.split ("()". Togararray (), 3) , qui te donnerait la barre [0] est la ville et la barre [1 ] à la province ...



2
votes

Vous avez quelques méthodes sur chaîne l'un d'entre eux étant Split .

Exemple xxx

qui imprimerait:

ville

(PR)

Vous pouvez aussi le faire comme ça xxx

Vous pouvez simplement supprimer la paranthèse avec d'autres méthodes de chaîne si vous le souhaitez.

On pourrait argumenter que ce n'est pas le meilleur façon de le faire. C'est simple et donne que tu veux que tu veux. Comme d'autres suggéraient, la Regex est probablement la méthode «la plus propre» de le faire.

note

Si vous souhaitez prendre en charge les villes avec des espaces dans le nom, Cette méthode ne fonctionnera pas bien pour vous. Je suggérerais alors l'une des autres réponses postées.


5 commentaires

Et si la ville est deux mots? Comme New York?


C'est sur l'ingénierie! Pourquoi penserais-on en dehors de la boîte? .. blague. N'a pas pensé aux villes avec 2 mots, puisque nous ne les avons pas, je vivais ..


@Filip Ekberg Qu'en est-il de Lilla Edet? ;-)


@fabler, ok donc 1 ville ici a une place de l'espace, chanter mon code serait comme .. Soutenir IE6;) De toute façon, mon exemple fonctionne avec la manipulation de la chaîne de base et indique maintenant à l'OP qu'il ne fonctionnera pas avec des espaces dans le mots.


@Filip ne plaisante que. J'ai eu du mal à trouver Lilla Edet pour être honnête. :-)



1
votes

Toute chance que vous puissiez modifier la conception de la DB pour avoir un champ différent pour contenir s'il s'agit d'une province ou d'un état? C'est un design horrible et pour le contourner, vous devez absolument écrire du code laid ... quelque chose du long des lignes de xxx


0 commentaires

1
votes

Bien que d'excellentes options d'analyse aient été mentionnées, je voudrais juste suggérer que vous envisagez d'aller à la source et à modifier votre requête de base de données et éventuellement même la base de données elle-même.

Évidemment, ce n'est pas toujours possible, ce qui est probablement pourquoi vous posez la question de la manière dont vous êtes, mais le fait que vous recevez de cette manière cela implique que les données doivent être structurées ou obtenues différemment. .


2 commentaires

Est ce que j'essaie de faire une infaction;)


@Alex: bon. Toujours pousser pour la correction du système "de la bonne façon", même si vous n'avez pas la chance de le faire cette fois-ci. Sans cette poussée, votre entreprise stagne technologiquement, et c'est mauvais. Malheureusement, il est rare que quiconque en dehors de la technologie comprenne cela, d'où la nécessité d'un retour.



14
votes

Vous pouvez utiliser des groupes REGEX et nommés. XXX

Explication de regex

(? [^ (] *) \ ((? PR> [^)] *) \) :

  • (? xxx) définit un groupe nommé ville
    • [^ (] * correspond à n'importe quel caractère qui n'est pas un ( entre 0 et des temps illimités
    • \ ( correspond à un ( une fois
    • (? xxx) définit un groupe nommé pr
      • [^)] * correspond à n'importe quel caractère qui n'est pas un ) entre 0 et des temps illimités
      • \) correspond à un ) une fois


1 commentaires

Regex est la voie à suivre! Cela a été fait pour ce type de tâches.



0
votes

Laissez l'instruction SQL suivante Sélectionnez tout le travail pour vous:

SELECT [Name], [Address], 
       LTRIM(RTRIM(LEFT([CityProv],CHARINDEX('(',[CityProv])-1))) as City, 
       LTRIM(RTRIM(SUBSTRING( [CityProv],
             CHARINDEX('(',[CityProv]) + 1,
             CHARINDEX(')',[CityProv]) - CHARINDEX('(',[CityProv]) - 1))) as Prov, 
       [PostalCode]
FROM Stackoverflow


0 commentaires