2015-09-03 2 views
0

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

На самом деле линия мне нужно проверить, всегда начинается так же

R_Wrt_somename(V_var) 

или

R_Wrt_othername((int64) (V_var2 * 3)) 

Я уже получил выражение для первого, но я не в состоянии получить фитинг выражение для второй возможности вызова функции.

Есть ли кто-нибудь, кто может помочь мне решить эту проблему? Я также был бы признателен за регулярное выражение с объяснением, поскольку я только начал работать с ними.

Выражение для первого типа функции:

R_Wrt_(\w+)\((\s*(V_)[a-zA-Z_0-9\[\] ]+) 
+1

Что вы действительно пытаетесь сделать? Использование регулярного выражения для синтаксического анализа общего С по существу является убыточным предложением. Даже для ограниченных подмножеств это может быть проблемой. Какие части ваших примеров различаются и какие части фиксированы?Похоже, что префикс 'R_Wrt_' может быть исправлен; остальная часть имени до круглой скобки является переменной. Могут ли быть пробелы раньше? Перед скобкой? Исправлен ли префикс 'V_' для простой ссылки на переменные, или это может измениться? Что вы написали для первого матча? На каком языке вы встраиваете свое регулярное выражение? Сколько стоит второй пример? –

+0

Например, всегда ли это '(int64)' как литой, или это могут быть другие типы? Является ли выражение после броска всегда в скобках? Всегда ли это один набор скобок, с одной переменной и умножением; это число всегда 3? Может ли выражение быть более сложным? Какие проблемы вы ищете? Есть ли точка с запятой после этих выражений или больше материала? Как вы можете видеть, вы оставили очень много информации из этого вопроса - и трудно дать хороший ответ, пока мы не узнаем, с чем вы имеете дело. –

+0

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

ответ

0

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

R_Wrt_(\w+)\((?:\((\w+)\)\s*)?\(?(\s*(V_)[a-zA-Z_0-9\[\]* ]+)\)* 

См demo

регулярное выражение матчей:

  • R_Wrt_ - буквенные R_Wrt
  • (\w+) - 1 или более латинские буквы, цифры или подчеркивания (захватывается в 1-й группе)
  • \( - буквальным открывающая скобка
  • (?:\((\w+)\)\s*)? - необязательный без захвата группы (так, чтобы не беспорядок групп), что соответствует ...
    • \( - буквальный открывающая скобка
    • (\w+) - 1 или более латинские буквы, цифры или подчеркивания (захваченные в группе 2)
    • \)\s* - буквального закрывающей скобки с дополнительным пробелом
  • \(? - буквального необязательной открывающей скобкой
  • (\s*(V_)[a-zA-Z_0-9\[\]* ]+) - в группе захвата 3 (от исходного регулярное выражение) соответствие ...
    • \s* - необязательные пробелы
    • (V_) - буквальным V_ (захватывается в группе 4)
    • [a-zA-Z_0-9\[\]* ]+ - 1 или более символов из набора
  • \)* - 0 или более буквальным закрытия скобки.
+1

большое спасибо, это на самом деле это для меня :) – Roke

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