Как извлечь подстроку из .NET RegEx?

Шаблоны должны использоваться в заголовках, потому что компилятор должен создавать экземпляры разных версий кода в зависимости от параметров, заданных / выведенных для параметров шаблона. Помните, что шаблон не представляет собой код напрямую, а шаблон для нескольких версий этого кода. Когда вы компилируете функцию non-template в файле .cpp, вы компилируете конкретную функцию / класс. Это не относится к шаблонам, которые могут быть созданы с использованием разных типов, а именно, если при замене параметров шаблона конкретными типами необходимо исправить конкретный код.

Была функция с ключевым словом export, которая была предназначенный для отдельной компиляции. Функция export устарела в C++11 и, AFAIK, только один компилятор реализовал ее. Вы не должны использовать export. Отдельная компиляция невозможна в C++ или C++11, но, возможно, в C++17, если понятия в нее входят, мы могли бы иметь некоторый способ отдельной компиляции.

Для отдельной компиляции, которая должна быть достигнута, разделить проверка шаблона тела должна быть возможна. Кажется, что решение возможно с концепциями. Взгляните на этот документ , недавно представленный на совещании по стандартам. Я думаю, что это не единственное требование, поскольку вам все равно необходимо создать код кода шаблона в коде пользователя.

Отдельная проблема компиляции для шаблонов, я думаю, это также проблема, возникающая при миграции на модули, которые в настоящее время работают.

35
задан Andrew Grant 10 April 2009 в 19:03
поделиться

2 ответа

Я думаю, что вы хотите

match.Groups[1].Value

(Как указывает Дилли-О в комментариях, это группа 1, потому что группа 0 - это всегда полное совпадение.)

Короткая, но полная программа тестирования:

using System;
using System.Text.RegularExpressions;

class Program
{
  static void Main()
  {
    Regex regex = new Regex("<key>LibID</key><val>([a-fA-F0-9]{4})</val>");
    Match match = regex.Match("Before<key>LibID</key><val>A67A</val>After");

    if (match.Success)
    {
      Console.WriteLine("Found Match for {0}", match.Value);
      Console.WriteLine("ID was {0}", match.Groups[1].Value);
    }      
  }
}

Вывод:

Found Match for <key>LibID</key><val>A67A</val>
ID was A67A
61
ответ дан 27 November 2019 в 04:43
поделиться

Добавить группирующую конструкцию к вашему выражению ...

<key>(?<id>LibID)</key><val>([a-fA-F0-9]{4})</val>

Это будет захватывать идентификатор , Но вам нужно указать правильный формат в вашем выражении для фактического идентификатора, потому что ваше регулярное выражение будет записывать только «LibID» буквально.

2
ответ дан 27 November 2019 в 04:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: