Почему это регулярное выражение не работает для c ++ TR1? - PullRequest
2 голосов
/ 03 февраля 2012

Я признаю, что прошло много времени с тех пор, как я работал с C ++, но, насколько я могу судить, мой код должен работать. Я пытаюсь заменить / удалить все комментарии блока из файла, содержащего код. Я помещаю весь искомый файл в строку, и строка содержит символы новой строки.

Вот мой код

std::tr1::regex rx1("[/][*][\S\s]*?[*][/]");
stringName = std::regex_replace(stringName, rx1, std::string(""));

Насколько я могу судить, это должно соответствовать / * здесь, включая новые строки * /

Я даже протестировал его на http://gskinner.com/RegExr/,, где он идеально соответствует комментариям блока. Проблема в том, что блочные комментарии не заменяются. Это какая-то специфическая ошибка TR1?

Ответы [ 2 ]

3 голосов
/ 04 февраля 2012

Вы должны учитывать, что есть слои, которые вы делаете.

  • Сначала вы строите строку внутри строкового литерала. Для человека это выглядит как регулярное выражение, но строковый литерал не волнует.

    Этот строковый литерал содержит, помимо прочего, специальные символы, которые дают \S и \s соответственно (точно так же, как \n особенный).

  • Затем вы передаете эту строку & mdash; специальные символы и все & mdash; к двигателю регулярных выражений.

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

std::tr1::regex rx1("[/][*][\\S\\s]*?[*][/]")

Движок регулярных выражений будет правильно видеть выражение:

[/][*][\S\s]*?[*][/]

Кроме того, я бы проверил, требуется ли разделителю для двигателя tr1. Обычно это хорошая идея.

1 голос
/ 05 февраля 2012

Гонки Легкости на Орбите подтолкнули меня по правильному пути, но получается * и?нельзя использовать для аргументов в скобках [].Способ сделать это - использовать группу без захвата, в которой есть операторы или.

Код для поиска многострочных комментариев к блоку:

std::tr1::regex rx3("[/][*](?:\s|.|\n)*?[*][/]");

(?: выражение) - как сделать не захватывающийгруппа.Вы можете применить * и?за пределами этого.Внутри него используйте |как или заявление.

...