Domanda

Vorrei dividere la stringa di esempio:

  

~ ~ Peter Lois ~ Chris ~ ~ Meg Stewie

sul carattere ~ e il risultato deve essere

  

Peter
  Lois
  Chris
  Meg
  Stewie

Usando una funzione standard di divisione delle stringhe in javascript o C # il primo risultato è ovviamente una stringa vuota. Vorrei evitare di dover ignorare il primo risultato perché il primo risultato potrebbe effettivamente essere una stringa vuota.

Mi sono armeggiato con l'uso di un'espressione regolare e sono sconcertato. Sono sicuro che qualcuno si sia imbattuto in una soluzione elegante per questo.

È stato utile?

Soluzione

Per le tue esigenze, vedo due opzioni:

(1) Rimuovi il prefisso iniziale, se presente.

(2) Utilizzare un'espressione regolare completa per separare la stringa.

Entrambi sono illustrati in questo codice:

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'espressione regolare in # 2 corrisponde al carattere delimitatore seguito da un gruppo di corrispondenza contenente zero o più caratteri non delimitatori. Le corrispondenze risultanti sono le stringhe delimitate (comprese eventuali stringhe vuote). Per ogni corrispondenza, & Quot; match.Value & Quot; è l'intera stringa che include il delimitatore iniziale e " match.Groups 1 . & valore quot; è il primo gruppo di corrispondenze contenente la stringa libera del delimitatore.

Per completezza, la terza codifica (# 3) è inclusa mostrando lo stesso metodo di espressione regolare in # 2, ma in uno stile di codifica LINQ.

Se hai difficoltà con le espressioni regolari, consiglio vivamente Mastering Regular Expressions, Third Edition di Jeffrey EF Friedl . È di gran lunga il miglior aiuto per comprendere le espressioni regolari e in seguito serve da eccellente riferimento o aggiornamento, se necessario.

Altri suggerimenti

In C #, questo sembra ottenere ciò che vuoi:

"~Peter~Lois~Chris~Meg~Stewie".Split("~".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

Ecco un approccio LINQ ...

Nota, con RegexOptions.ExplicitCapture le corrispondenze non sono incluse. Senza di essa verrà incluso anche '~'.

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();
        }
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top