можно использовать (как регулярное выражение в c ++? - PullRequest
0 голосов
/ 02 февраля 2019

Я пытаюсь получить имена и пароли (это упражнение, ничего плохого: p) большого документа.

Я использую регулярные выражения для имен, как показано ниже

regex e ("\\ b (name) ([^] *)");

Проблема возникает с ключами, так как они приходят сразу после (а если я делаю regex p ("\\ b (() ([^] *)"), это дает мне ошибку в памяти, где он инициализируется, возможно, он не инициализируется хорошо, но я ничего не нахожуоб этом в отношении конкретных символов, таких как (

для примера DOC:

имя прохода Тьюринга (31) <- я не могу принять это 31 </p>

С уважением!

1 Ответ

0 голосов
/ 02 февраля 2019

Как уже отмечали другие в комментариях, вам нужно избегать скобок, если вы хотите сопоставить их.Однако обратите внимание, что в этом случае есть два экранирующих механизма: механизм обработки регулярных выражений и механизм строковых литералов 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.)


Кстати, следите за пробелами в вашем регулярном выражении.Вы написали [^] *, что соответствует одному произвольному символу, за которым следует любое количество пробелов.Это, вероятно, не то, что вы имели в виду.

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