Regex: выделение текста в шаблонном синтаксисе - PullRequest
2 голосов
/ 22 февраля 2010

Я пытаюсь получить value часть этого синтаксиса:

[name:value]

Я дошел до:

\[name:(\w*)]

Что соответствует всему. Кто-нибудь знает изменения, которые мне нужно будет сделать, чтобы выбрать только значение? (Учитывая, что синтаксис также будет окружен другим текстом.

Ответы [ 3 ]

1 голос
/ 22 февраля 2010

Метод Match.Result - это то, что вы хотите. См. документацию API и документацию по шаблонам подстановки Regex .

Используйте Regex.Match(input, pattern).Result("$1"), чтобы получить то, что вы хотите.

Чтобы дать полный пример, вот модульный тест, который я использовал, чтобы подтвердить, что это решение будет работать:

[Test]
public void TestRegexMatchResult() {
    var input = "Other text [name:value] and other text";
    var pattern = @"\[name:(\w+)\]";

    Assert.AreEqual("value", Regex.Match(input, pattern).Result("$1"));
}

Тест пройден.

Вы также можете просмотреть строку и извлечь несколько вхождений шаблона:

[Test]
public void TestRegexMatchesResult() {
    var input = "Some [name:value] pairs [name:something] here.";
    var pattern = @"\[name:(\w+)\]";

    var results = Regex.Matches(input, pattern).OfType<Match>()
        .Select(match => match.Result("$1"));

    Assert.AreEqual(2, results.Count());

    Assert.AreEqual("value", results.ElementAt(0));
    Assert.AreEqual("something", results.ElementAt(1));
}

Наконец, если вам нужно абстрагироваться от чего-то, кроме «name», вы можете сделать это:

[Test]
public void TestMatchingNameAndValue() {
    var input = "[key:value] [another_key:some_other_value]";
    var pattern = @"\[(\w+):(\w+)\]";

    var results = Regex.Matches(input, pattern).OfType<Match>()
        .Select(match => new KeyValuePair<string, string>(
            match.Result("$1"),
            match.Result("$2")));

    Assert.AreEqual(2, results.Count());

    Assert.AreEqual("key", results.ElementAt(0).Key);
    Assert.AreEqual("value", results.ElementAt(0).Value);
    Assert.AreEqual("another_key", results.ElementAt(1).Key);
    Assert.AreEqual("some_other_value", results.ElementAt(1).Value);
}
1 голос
/ 22 февраля 2010

Регулярное выражение всегда будет соответствовать всей строке, но вы можете получить доступ к соответствующей части с помощью Группы коллекции элементов:

public static void Main()
{
   string pattern = @"(\d{3})-(\d{3}-\d{4})";
   string input = "212-555-6666 906-932-1111 415-222-3333 425-888-9999";
   MatchCollection matches = Regex.Matches(input, pattern);

   foreach (Match match in matches)
   {
      Console.WriteLine("Area Code:        {0}", match.Groups[1].Value);
      Console.WriteLine("Telephone number: {0}", match.Groups[2].Value);
      Console.WriteLine();
   }
   Console.WriteLine();
}

(этот пример взят со ссылочной страницы)

0 голосов
/ 22 февраля 2010

Вы можете использовать lookaround только для совпадения value.

Поиск (?<=\[name:)\w+(?=])

Это означает: соответствует одному или нескольким буквенно-цифровым символам, если и только если им предшествует [name, а затем ] Обратите внимание, что нет необходимости избегать ].

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