2016-03-19 6 views
0

Я хотел бы удалить определенные строки (предположим «aaa» и «bbb») из многострочной строки со стандартной библиотекой регулярных выражений C++. С заменой синтаксиса ECMAScript я бы использовал следующий шаблон: /^(aaa|bbb)$/gm. Я пытался передать что-то вроде как аргумент regex в std::regex_replace, но он не работает, поскольку ^ и $, похоже, не совпадают как начало и конец строки, хотя я не прошел match_not_eol или match_not_bol в качестве совпадений. Итак, как должен выглядеть шаблон C++ для этого случая?C++ regex: заменить шаблон в нескольких строках

+0

Можете ли вы отправить что-то, что можно скопировать и вставить в онлайн-компилятор? – Mikhail

+1

Если вы задумываетесь о том, как вы думаете, почему вы думаете, что «этот вопрос не показывает никаких исследований, он неясен или не полезен». Спасибо – tonso

+0

Я не спустил ... – Mikhail

ответ

1

Ссылка regex_replace не указана для обозначения флага для переопределения значений ^ и $. Таким образом, когда вам нужно искать и заменять линиями, используйте группу захвата (^|\r?\n) до и посмотреть (?=\r?\n|$) после основного рисунка (и заменить на backreference $1). Разумеется, шаблоны можно настроить, чтобы разрешить или не пустые строки после замены.

См IDEONE demo:

std::string s("ccc\r\naaa\r\ngggg"); 
std::regex ee(R"((^|\r?\n)(?:aaa|bbb)(?=\r?\n|$))"); 
std::string newtext = std::regex_replace(s, ee, "$1"); 
std::cout << newtext << std::endl; 

Выход:

ccc 

gggg 
+0

Спасибо за ответ. Я на самом деле попробовал что-то вроде соответствия «(^ | \ n)» в начале и «($ | \ n)» в конце шаблона, но кажется, что он не соответствует строке в случае, если предыдущая строка был заменен, вероятно, потому, что начало «(^ | \ n)» является частью предыдущего совпадения. Если вы замените шаблон на R "((^ | \ r? \ N) (?: ccc | aaa | bbb) (\ r? \ N | $))" в вашем примере вы можете видеть, о чем я говорю , – tonso

+0

В этом случае поверните конечную группу захвата в обратную сторону. Используйте 'std :: regex ee (R" ((^ | \ r? \ N) (?: aaa | bbb) (? = \ R? \ N | $)) ");' и заменим одним обратным адресом '$ 1 '. –

+0

Если я использую '(? = \ R? \ N | $)', это приводит к segfault, потому что '' 'включен в lookahead, я думаю, но если я использую' ((? = \ R? \ N) | $) 'все в порядке. Спасибо за помощь – tonso

Смежные вопросы