Comment diviser en utilisant un caractère de préfixe en utilisant des expressions régulières?

StackOverflow https://stackoverflow.com/questions/500031

  •  20-08-2019
  •  | 
  •  

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.

Était-ce utile?

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();
        }
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top