Как разделить с помощью префикса символа с помощью регулярных выражений? - PullRequest
5 голосов
/ 01 февраля 2009

Я хотел бы разбить пример строки:

~ ~ Питер Лоис ~ Крис ~ Мег ~ Stewie

на персонаже ~ и результат будет

Peter
Lois
Chris
Meg
Стьюи

Используя стандартную функцию разделения строк в javascript или C #, первый результат, конечно, является пустой строкой. Я хотел бы избежать необходимости игнорировать первый результат, потому что первый результат может фактически быть пустой строкой.

Я возился с использованием регулярного выражения, и я в замешательстве. Я уверен, что кто-то нашел и элегантное решение этого вопроса.

Ответы [ 3 ]

4 голосов
/ 01 февраля 2009

Для ваших требований я вижу два варианта:

(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.Value» представляет собой всю строку, включая ведущий разделитель, а «match.Groups 1 .Value» является первой группой совпадений, содержащей свободную строку.

Для полноты информации включена третья кодировка (# 3), показывающая тот же метод регулярного выражения в # 2, но в стиле кодирования LINQ.

Если вы боретесь с регулярными выражениями, я настоятельно рекомендую Освоение регулярных выражений, третье издание Джеффри Э. Ф. Фридлом . Это, безусловно, лучшая помощь для понимания регулярных выражений, а затем она служит отличным справочником или освежающим при необходимости.

1 голос
/ 01 февраля 2009

Вот подход LINQ ...

Обратите внимание, что с RegexOptions.ExplicitCapture совпадения не включены. Без этого также будет добавлено «~».

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();
        }
    }
}
1 голос
/ 01 февраля 2009

В C # это похоже на то, что вы хотите:

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