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

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

  •  20-08-2019
  •  | 
  •  

Вопрос

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

~Питер ~ Лоис ~ Крис ~ Мэг ~ Стьюи

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

Питер
Лоис
Крис
Мэг
Стьюи

Используя стандартную функцию разделения строк в 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();
        }
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top