Как уже отмечали другие в комментариях, вам нужно избегать скобок, если вы хотите сопоставить их.Однако обратите внимание, что в этом случае есть два экранирующих механизма: механизм обработки регулярных выражений и механизм строковых литералов C ++.
Так, например, механизм регулярных выражений может ожидать что-то вроде этого:
\(name\) \(\d+\)
Здесь скобки ()
экранированы, поэтому механизм регулярных выражений не будет использовать их для группировки.Таким образом, приведенное выше регулярное выражение сопоставляется, например, с (name) (123)
.
Теперь, чтобы записать строковый литерал C ++, вам необходимо избежать (в частности) обратной косой черты.Таким образом, вы бы написали
std::regex e("\\(name\\) \\(\\d+\\)");
Если вы хотите избежать этих неприятных \\
, вы также можете использовать необработанный строковый литерал :
std::regex e(R"X(\(name\) \(\d+\))X");
~~~~~~~~~~~~~~~~
Здесьпрефикс «R» означает, что вы пишете необработанный строковый литерал.X(
и )X
- произвольные разделители .(Подробнее об этом можно узнать по https://en.cppreference.com/w/cpp/language/string_literal или различным вопросам SO.)
Кстати, следите за пробелами в вашем регулярном выражении.Вы написали [^] *
, что соответствует одному произвольному символу, за которым следует любое количество пробелов.Это, вероятно, не то, что вы имели в виду.