регулярное выражение соответствует строке слева от комментария С ++

Я ищу шаблон для извлечения строки слева от комментария С ++ и самого комментария. Проблема в том, что левая сторона также может содержать одну косую черту.

Пример:

"abc/def//comment"

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

  1. abc / def
  2. //комментарий

Какие-либо предложения?


person 6was9    schedule 23.03.2011    source источник
comment
Вы уверены, что хотите сделать это с помощью регулярного выражения? Иногда делать что-то программно проще (и это кажется одним из них).   -  person orlp    schedule 23.03.2011
comment
@nightcracker: что такого сложного в том, чтобы сделать это с помощью регулярного выражения?   -  person siride    schedule 23.03.2011
comment
@siride: строковые литералы, макросы, вложенные комментарии и т. д. Синтаксис языка обычно не может быть проанализирован с помощью регулярного выражения (например, HTML).   -  person orlp    schedule 23.03.2011
comment
@nightcracker: да, я знаю, но здесь нет произвольной вложенности. Как только вы получите двойной слеш, все до конца строки будет помещено в комментарий, точка. Чтобы раньше иметь дело с двойными косыми чертами, вы можете использовать просмотр вперед и другие уловки, чтобы справиться с косыми чертами, встроенными в строки.   -  person siride    schedule 23.03.2011


Ответы (2)


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

((?:(?!//).)*)(//.*)

или просто:

(.*?)(//.*)

То есть, группа 1 содержит abc/def, а группа 2 содержит //comment.

Имейте в виду, что когда это не удается со строковыми литералами и многострочными комментариями (чтобы назвать только две ямы):

"a string with // in it"

/*
// not a comment!
*/
person Bart Kiers    schedule 23.03.2011

echo "abc/def//comment" | sed -r 's|(.*)//(.*)|\1 //\2|'
abc/def //comment

А как насчет нескольких пар косых черт? Комментарии внутри строк допустимы?

person user unknown    schedule 23.03.2011
comment
Будьте осторожны: первый жадный .* будет потреблять a // b из строки, содержащей более одного //, например: "a // b // c". - person Bart Kiers; 23.03.2011
comment
Вот почему я спросил: «А как насчет нескольких пар косых черт?». Видишь. :) - person user unknown; 23.03.2011