Come dividere usando un prefisso usando espressioni regolari?
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.
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();
}
}
}