C # Regex, чтобы получить блок комментариев из кода pl / sql - PullRequest
1 голос
/ 17 марта 2009

Я хочу извлечь комментарии из строки в виде блока.

например. У меня есть код PL / SQL как:

--comment1
select * from t_table;
--i want comment 2;
/*i want comment
3 */
--i want comment 4
OPEN data_cur;

Здесь я хочу, чтобы все однострочные и многострочные комментарии были перед OPEN data_cur; но после выберите * из t_table;

т.е. я хочу полный блок комментариев между двумя операторами PL / SQL.

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

  1. Оператор SQL
  2. весь блок комментариев

Можно ли это сделать с помощью любого регулярного выражения?

1 Ответ

2 голосов
/ 17 марта 2009
(?ms)^\s*([^\-/\s][^;]+;)((?:(?:\s+/\*(?:.(?!\*/))+.\*/)|(?:\s+\-\-[^\r\n]+))*)

должен делать это красиво.
(Примечание: (?ms) - это способ в Java указать режим «многострочный» «точка-все», но у меня проверено на RETester , и он работает)

Может обнаруживать 0 или более комментариев после select.
Многострочные комментарии принимаются между /* и */ из-за использования положительного прогноза (?:.(?!\*/))+ в группе без захвата

Обновление: изменено, чтобы обнаруживать любую строку без комментариев перед 0 или многими комментариями.


Чтобы обнаружить комментарий1, затем утверждение, затем комментарии:

(?ms)((?:(?:\s+/\*(?:.(?!\*/))+.\*/)|(?:\s+\-\-[^\r\n]+))*)\s*^\s*([^\-/\s][^;]+;)((?:(?:\s+/\*(?:.(?!\*/))+.\*/)|(?:\s+\-\-[^\r\n]+))*)

Примечание: у меня есть обновление в обоих регулярных выражениях (в начале и в этом) части обнаружения операторов:

\s*([^\-/][^;]+;)

до

\s*([^\-/\s][^;]+;)

Примечание bis: будет обнаружен только первый "comments - statement - comments".
Следующие блоки также будут обнаружены, но только как: "statement - comments", затем "statement - comments" и так далее. (комментарии над утверждением являются частью комментариев ниже предыдущего заявления)

...