Как разделить использование символа префикса с помощью регулярных выражений?
Вопрос
Я хотел бы разделить строку примера:
~Питер ~ Лоис ~ Крис ~ Мэг ~ Стьюи
о персонаже ~
и пусть результат будет
Питер
Лоис
Крис
Мэг
Стьюи
Используя стандартную функцию разделения строк в javascript или C #, первым результатом, конечно же, является пустая строка.Я бы хотел избежать необходимости игнорировать первый результат, потому что первый результат на самом деле может быть пустой строкой.
Я повозился с использованием регулярного выражения и зашел в тупик.Я уверен, что кто-то нашел элегантное решение для этого.
Решение
Для ваших требований я вижу два варианта:
(1) Удалите начальный символ префикса, если он присутствует.
(2) Используйте полное регулярное выражение для разделения строки.
Оба варианта проиллюстрированы в этом коде:
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+"'"))
;
}}
Регулярное выражение в #2 соответствует символу-разделителю, за которым следует группа совпадений, содержащая ноль или более символов, не являющихся разделителями.Результирующие совпадения представляют собой строки с разделителями (включая любые пустые строки).Для каждого совпадения "match.Значение" - это вся строка, включая начальный разделитель и "match.Группы1.Value" - это первая группа совпадений, содержащая строку без разделителя.
Для полноты картины включена третья кодировка (#3), показывающая тот же метод регулярного выражения, что и в # 2, но в стиле кодирования LINQ.
Если вы испытываете трудности с регулярными выражениями, я настоятельно рекомендую Освоение регулярных выражений, Третье издание Джеффри Э.F.Жареный Картофель.Это, безусловно, лучшее подспорье для понимания регулярных выражений, а позже, при необходимости, послужит отличным справочником или обновлением.
Другие советы
В C # это, кажется, дает то, что вы хотите:
"~Peter~Lois~Chris~Meg~Stewie".Split("~".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
Вот подход LINQ...
Обратите внимание, с RegexOptions.Явный захват совпадений не включен.Без этого '~' также будет включено.
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();
}
}
}