Comment diviser en utilisant un caractère de préfixe en utilisant des expressions régulières?
Question
Je voudrais scinder l'exemple de chaîne:
~ Peter ~ Lois ~ Chris ~ Meg ~ Stewie
sur le caractère ~
et que le résultat soit
Peter
Lois
Chris
Meg
Stewie
En utilisant une fonction de division de chaîne standard en javascript ou en C #, le premier résultat est bien sûr une chaîne vide. J'aimerais éviter d'ignorer le premier résultat car le premier résultat peut en réalité être une chaîne vide.
Je me suis habitué à utiliser une expression régulière et je suis perplexe. Je suis sûr que quelqu'un a trouvé une solution élégante à ce problème.
La solution
Pour vos besoins, je vois deux options:
(1) Supprimez le caractère de préfixe initial, le cas échéant.
(2) Utilisez une expression régulière complète pour séparer la chaîne.
Les deux sont illustrés dans ce code:
using System;
using System.Linq;
using System.Text.RegularExpressions;
class APP { static void Main() {
string s = "~Peter~Lois~Chris~Meg~Stewie";
// #1 - Trim+Split
Console.WriteLine ("[#1 - Trim+Split]");
string[] result = s.TrimStart('~').Split('~');
foreach (string t in result) { Console.WriteLine("'"+t+"'"); }
// #2 - Regex
Console.WriteLine ("[#2 - Regex]");
Regex RE = new Regex("~([^~]*)");
MatchCollection theMatches = RE.Matches(s);
foreach (Match match in theMatches) { Console.WriteLine("'"+match.Groups[1].Value+"'"); }
// #3 - Regex with LINQ [ modified from @ccook's code ]
Console.WriteLine ("[#3 - Regex with LINQ]");
Regex.Matches(s, "~([^~]*)")
.OfType<Match>()
.ToList()
.ForEach(m => Console.WriteLine("'"+m.Groups[1].Value+"'"))
;
}}
L'expression régulière dans # 2 correspond au caractère de délimitation suivi d'un groupe de correspondance contenant zéro ou plusieurs caractères non-délimiteurs. Les correspondances résultantes sont les chaînes délimitées (y compris les chaînes vides). Pour chaque correspondance, & Quot; match.Value & Quot; est la chaîne entière, y compris le délimiteur principal et " match.Groups 1 . Valeur & Quot; est le premier groupe de correspondance contenant la chaîne libre de délimiteur.
Pour être complet, le troisième codage (# 3) est inclus, montrant la même méthode d’expression régulière en # 2, mais dans un style de codage LINQ.
Si vous avez des problèmes avec les expressions régulières, je vous recommande vivement Maîtriser les expressions régulières, troisième édition, par Jeffrey EF Friedl . C’est de loin le meilleur moyen de comprendre les expressions régulières et, par la suite, il constitue une excellente référence ou un rafraîchissement si nécessaire.
Autres conseils
En C #, cela semble obtenir ce que vous voulez:
"~Peter~Lois~Chris~Meg~Stewie".Split("~".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
Voici une approche LINQ ...
Remarque: avec RegexOptions.ExplicitCapture, les correspondances ne sont pas incluses. Sans cela, le '~' sera également inclus.
using System;
using System.Linq;
using System.Text.RegularExpressions;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
string s = "~Peter~Lois~Chris~Meg~Stewie";
Regex.Split(s, "(~)", RegexOptions.ExplicitCapture)
.Where(i=>!String.IsNullOrEmpty(i))
.ToList().ForEach(i => Console.WriteLine(i));
Console.ReadLine();
}
}
}