Я пишу сценарий Ruby, который использует регулярные выражения для поиска всех комментариев определенного формата в файлах исходного кода Objective-C.
Формат
/* <Headline_in_caps> <#>:
<Comment body>
**/
Я хочу записать заголовок в шапках, номер и текст комментария.
С помощью приведенного ниже регулярного выражения я могу найти один комментарий в этом формате в большей части текста.
Моя проблема в том, что если в файле более одного комментария, я получаю весь текст, включая код, между первым /*
и последним **/
. Я не хочу, чтобы он захватывал весь текст включительно, а только то, что находится внутри каждого /*
и **/
.
Тело комментария может содержать все символы, кроме **/
и */
, которые оба означают конец комментария. Правильно ли я полагаю, что регулярное выражение найдет несколько совпадений с целым регулярным выражением, обрабатывая текст только один раз?
\/\*\s*([A-Z]+). (\d)\:([\w\d\D\W]+)\*{2}\//x
Разбитое на части регулярное выражение делает это:
\/\*
- находит начало комментария
\s*
- поиск пробелов
([A-Z]+)
- захватывает заглавные буквы
.<space>
- найти пробел между заглавными буквами и цифрами
(\d)
- захватить цифру
\:
- найти двоеточие
([\w\W\d\D]+)
- захватывает тело сообщения, которое может содержать все допустимые символы, кроме **/
или */
\*{2}\/
- находит конец комментария
Вот пример, все от первого /*
до второго **/
захвачено .:
/*
HEADLINE 1:
Comment body.
**/
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// This text and method declaration are captured
// The regex captures from HEADLINE to the end of the comment "meddled in." inclusively.
/*
HEADLINE 2:
Should be captured separately and without Objective-C code meddled in.
**/
}
Вот пример на Rubular: http://rubular.com/r/4EoXXotzX0
Я использую gsub
для обработки регулярного выражения в строке всего файла, используя Ruby 1.9.3. Другая проблема, с которой я столкнулся, заключается в том, что gsub дает мне то, что игнорирует Rubular, является ли это регрессией или Rubular использует другой метод, который дает то, что я хочу?
В этом вопросе Regex, сопоставляющее множественные вхождения для файла и в строке для множественных вхождений, ответом является использование g для глобальной опции, которая недопустима в Ruby regex.