Как я могу изменить это регулярное выражение, чтобы взять текст перед двоеточием FIRST и игнорировать остальные? - PullRequest
0 голосов
/ 05 июля 2010

Что я должен изменить в этом регулярном выражении, чтобы в обоих случаях ниже он получал текст перед первым двоеточием в качестве "метки" и весь остальной текст как «текст».

using System;
using System.Text.RegularExpressions;

namespace TestRegex92343
{
    class Program
    {
        static void Main(string[] args)
        {
            {
                //THIS WORKS:
                string line = "title: The Way We Were";
                Regex regex = new Regex(@"(?<label>.+):\s*(?<text>.+)");
                Match match = regex.Match(line);
                Console.WriteLine("LABEL IS: {0}", match.Groups["label"]); //"title"
                Console.WriteLine("TEXT IS: {0}", match.Groups["text"]); //"The Way We Were"
            }

            {
                //THIS DOES NOT WORK:
                string line = "title: The Way We Were: A Study of Youth";
                Regex regex = new Regex(@"(?<label>.+):\s*(?<text>.+)");
                Match match = regex.Match(line);

                Console.WriteLine("LABEL IS: {0}", match.Groups["label"]);
                //GETS "title: The Way We Were"
                //SHOULD GET: "title"

                Console.WriteLine("TEXT IS: {0}", match.Groups["text"]); 
                //GETS: "A Study of Youth"
                //SHOULD GET: "The Way We Were: A Study of Youth"
            }

            Console.ReadLine();

        }
    }
}

Ответы [ 2 ]

3 голосов
/ 05 июля 2010
new Regex(@"(?<label>[^:]+):\s*(?<text>.+)");

Это просто заменяет точку классом символов [^:].Это означает любой символ, кроме двоеточия.

2 голосов
/ 05 июля 2010

Регулярные выражения являются жадными, и . соответствует что угодно .Вот почему лейбл получает всю строку.Если ваши заголовки всегда просто текстовые, я бы порекомендовал следующее:

(?<label>\w+):\s*(?<text>.+)

В противном случае вы можете сделать выражение не жадным:

(?<label>.+?):\s*(?<text>.+)

Вы хотите избежать жадных оператороввсегда, когда это возможно, и всегда старайтесь соответствовать тому, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...