8 votes

Aide pour la manipulation de certaines chaînes de caractères

Mes cordes sont de ce type : City (PR) à partir d'une base de données, où PR signifie Province.

À la fin, je veux deux variables distinctes. La ville et la RP.

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

14voto

dtb Points 104373

En supposant que les villes ne contiennent pas ( des personnages :

string s = "City (PR)";
int p = s.LastIndexOf("(");

string city = s.Substring(0, p).Trim();
string province = s.Substring(p + 1, s.Length - p - 2).Trim();

city est la sous-chaîne à partir du premier caractère jusqu'au dernier caractère non compris. ( caractère.
province est la sous-chaîne du premier caractère après le dernier ( jusqu'à la fin, à l'exception du dernier caractère.

14voto

Julien Hoarau Points 23987

Vous pouvez utiliser Regex et des groupes nommés.

string resultString = "New York (New York)";
Regex regexObj = new Regex(@"(?<City>[^(]*)\((?<PR>[^)]*)\)",RegexOptions.IgnoreCase);

var match = regexObj.Match(subjectString);
if (match.Success)
{
  string city = match.Groups["City"].Value.Trim();
  string province = match.Groups["PR"].Value;
}

Explication des regex

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

  • (?<City>XXX) définit un groupe nommé City
    • [^(]* correspond à tout caractère qui n'est pas un ( entre 0 et un nombre illimité de fois
  • \( correspond à un ( une fois
  • (?<PR>XXX) définit un groupe nommé PR
    • [^)]* correspond à tout caractère qui n'est pas un ) entre 0 et un nombre illimité de fois
  • \) correspond à un ) une fois

10voto

Kirschstein Points 5229

Regex ?

Vous pouvez diviser votre modèle en groupes de capture et partir de là.

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

Cela permettra de capturer la ville dans le premier groupe et votre partie PR/Province dans le second.

Edita: madgnomes regex supprime les parathénèses de la correspondance, même si la Regex devient effrayante à ce stade :)

2voto

Filip Ekberg Points 22189

Vous avez quelques méthodes sur string l'une d'entre elles étant Split .

Ejemplo

var s = "City (PR)";
var words = s.Split(' ');
foreach (string word in words)
{
    Console.WriteLine(word);
}

Ça s'imprimerait :

Ville

(PR)

Vous pouvez aussi le faire comme ceci

var words = s.Split(' ');
var city = words[0];
var pr = words[1];

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

On pourrait dire que ce n'est pas la meilleure façon de procéder. C'est simple et cela vous donne ce que vous voulez. Comme d'autres l'ont suggéré, les expressions rationnelles sont probablement le moyen le plus "propre" de le faire.

Note

Si vous souhaitez prendre en charge des villes dont le nom comporte des espaces, cette méthode ne vous conviendra pas vraiment. Je vous suggère alors l'une des autres réponses proposées.

1voto

LittleBobbyTables Points 17738

Si la province est toujours entre parenthèses et que le nom de la ville ne comporte pas de parenthèses, vous pouvez utiliser la fonction Split.

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

La variable bar aura la ville dans la première colonne du tableau, et la province dans la deuxième (mais vous voudrez enlever la parenthèse droite).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X