Регулярное выражение с (слишком?) Многими случаями - PullRequest
0 голосов
/ 03 мая 2020

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

Следуя возможным случаям строк, с которыми я могу столкнуться, которые должны передать Regex:

//#define variable_name { 300 }

#define variable_name { 300 }

//#define variable_name

#define variable_name

//#define variable_name { 300 } // Comment

#define variable_name { 300 } // Comment

#define variable_name // Comment

//#define variable_name // Comment

Следующие правила применяются к каждой строке выше:

  • При желании строка может начинаться с косой черты с комментариями (т.е. //)
  • #define variable_name всегда будет присутствовать
  • Переменная может иметь значение (например, {300})
  • Значение переменной (если имеется) может быть всех возможных типов (текст, число или вектор)
  • Строка может иметь ведущий комментарий, либо после значения, либо непосредственно после имени переменной

Мне удалось успешно создать следующее выражение вплоть до значения необязательного значения переменной или необязательного комментария:

/^(\/\/)?(#define)\s(\w+)\s?(.*[\/\/]?)?

Выражение можно проверить здесь: https://regex101.com/r/krZB71/3/

Проблема, с которой я столкнулся, видна в группе 4 пятого (5) и шестое (6) совпадение, значение и ведущий комментарий заканчиваются b Это сгруппировано вместе ... Моя цель - отдельно сгруппировать имя переменной, необязательное значение, необязательный ведущий комментарий

Мне нужна помощь для части после \s?:

/^(\/\/)?(#define)\s(\w+)\s? xxxxxxxxxx

Любая помощь высоко ценится

Ответы [ 2 ]

1 голос
/ 03 мая 2020

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

^(\/\/)?(#define)\s(\w+)\s?(.*?)(\/\/.*?)?$
0 голосов
/ 03 мая 2020

Вы можете сделать шаблон немного более точным и использовать дополнительные группы захвата для получения отдельных значений.

^(\/\/)?(#define)\s(\w+)(?:\s?({[^{}]*})?\s?(\/\/\s?(.*))?)?
  • ^ Начало строки
  • (\/\/)? Дополнительно группа 1 , совпадение //
  • (#define)\s Группа захвата 2, совпадение #define и символ пробела
  • (\w+) Захват группа 3 Соответствие 1+ словам символов
  • (?: Группа без захвата
    • \s? Соответствие необязательному символу пробела
    • ( Дополнительный захват группа 4
      • {[^{}]*} Совпадение { ... }
    • )? Закрыть группу 4 и сделать ее необязательной
    • \s? Соответствует необязательному пробельному символу
    • ( Опциональный захват группа 5
      • \/\/\s? Соответствует //, затем необязательный пробельный символ
      • (.*) Захват группа 6 соответствует любому символу, кроме новой строки
    • )? Закрыть группу 5 и сделать ее необязательной
  • )? Закрыть группу без захвата и сделать ее доступной поэтому вся последняя часть является необязательной

Regex demo

Примечание , что \s также соответствует символу новой строки. Если вы хотите сопоставить пробельные символы без перевода строки, вы можете сопоставить символы табуляции или пробелы [\t ] или сопоставить пробельные символы, за исключением перевода строки [^\S\r\n].

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...