2012-06-28 2 views
0

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

const size N = 1; 
const size MAX = 1; 
int const stant = 1147; 
int x = 4; 

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

const\s.*(\]|\s|\*)VARIABLETOCHECK(\(|\[|=|\s|;) 

Описание выражения:

  • \s - космос "const".
  • .* - любое количество символов.
  • (\]|\s|\*) - символы, которые должны идти перед переменной.
  • VARIABLETOCHECK - это место, где я устанавливаю свое имя переменной, которое я хочу проверить.
  • (\(|\[|=|\s|;) - символы, которые должны идти после переменной

Проблема:

Проблема заключается в том, что если есть только пробел после слова const мое выражение не работает.

А также каждый из переменных (N, MAX, stant) должны соответствовать отдельно:

const\s.*(\]|\s|\*)N(\(|\[|=|\s|;) 

Это должно выбрать только строку: const size N = 1;

+0

попробуйте сделать выражение подходящим для одного пробела и необязательно большего. Кроме того, вы должны, вероятно, сопоставлять ноль или более пробелов вокруг знака равенства, потому что все они являются допустимыми объявлениями const: 'const size n = 1;', 'const ----- size --- n --- = - -1' и 'constsize n = 1' (пробелы указывают пробелы) –

+0

Существует множество различных вариантов определения константных переменных. – yurart

+0

Другое: const unsigned int width = 20, height = 20; "; – yurart

ответ

1

Использование регулярных выражений:

\bconst\b\s*(?:.*\b)?(VARIABLETOCHECK\b[^=]*?)\s*\=\s*(.*?)\s*[,;] 

См. Контрольный код here. Если он проверяет синтаксис «const», он возвращает имя переменной и ее значение.

+0

" const unsigned int templ_width = 20, templ_height = 20; "; это неправильно обрабатывается – yurart

+0

@yurart - потому что это не то, что вы опубликовали в ваш вопрос, где у вас есть одно задание на строку. –

+0

Да, я сожалею об этом. Я исправлю это: – yurart

0

Это очень неудобно и работает только на нескольких тестовых примерах на этом языке. Написание регулярного выражения, которое анализирует так же, как C#, очень сложно. Но давайте работать с тем, что у вас есть.

вы пишете «символы, которые должны идти перед переменной», но вы имеете в виду «символы, которые может идти перед переменной», правильно? Так что вам нужно * потом сказать, что эти символы могут произойти или не произойти:

const\s.*(\]|\s|\*)*VARIABLETOCHECK(\(|\[|=|\s|;) 

Теперь у вас есть .* перед вашей переменной, которая означает любую строку, на самом деле. Вы, вероятно, следует исключить ; и =, по крайней мере, с помощью

const\s[^;=]*(\]|\s|\*)*VARIABLETOCHECK(\(|\[|=|\s|;) 
+0

что, если тип будет «myconst», например? >> http://ideone.com/G7IOt –

1

Если я правильно понял ваш вопрос прямо ваша цель состоит в том, чтобы обеспечить запись является постоянной.

Вход: Линия текста

Ожидаемый результат: Правда, если ее постоянная, иначе Ложные


Регулярное выражение:

Для этого я предлагаю следующее regex:

^.*?const\s+(\w+\s+)?(\w)\s+=.*$ 

Объяснение:

^ Начало линии

.*? Любые символы совпадают и его нежадным

const Ключевое

\s+ Atleast один пробельные

(\w+\s+)? Дополнительное слово, нет t имя переменной.

(\w) Слово, которое является именем переменной.

\s+ Дополнительный пробельные

= Равно буквальное значение

.* Любой персонаж

$ Конец строки

Также вторая группа в регулярном выражении получит вам ваше имя переменной, упаковывают если вы хотите проверить с помощью предопределенного списка имен.


Исход выше регулярное выражение:

const size N = 1; ==>Правда

const size MAX = 1; ==>Правда

int const stant = 1147; ==>Правда

int x = 4; ==>Ложные

При желании вы можете получить имя переменной, получив вторую группу в согласовани.

Я бы не стал жестко кодировать VARIABLETOCHECK, и его плохая практика жестко кодируется в большинстве случаев.

0

Я был не в том направлении.

Решение следующее: 1. загрузить Doxygen 2. генераторных отчет в формате XML 3. получить глобальные переменные из XML

Спасибо всем!

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