2016-06-01 4 views
-1

Мне нужно, чтобы соответствовать что-то вроде этого:Regex для соответствия объявления переменной

int a= 4, b, c = "hi"; 

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

a= 4, b, c = "hi" 

Я не позаботьтесь о типах переменных, например «hi» - String, потому что это будет проверено позже в коде.

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

Это примеры, которые не должны соответствуют:

a b= 4 
var, 
,hello=3 
=8 

Я проверил this вопрос, оно не помогло.

Я пробовал код this, но есть пара проблем, а именно почти все, что я перечислял в вещах, которые не должны совпадать, соответствовать.

Также может быть больше вещей, которые я пропустил. Я должен соответствовать строкам с пробелами, например a = "hello there", и нет необходимости соответствовать строке с , внутри нее.

«Формальное» Defenition, что имя переменной может быть:

Имя переменной может быть любая последовательность (длина> 0) букв (прописные или строчные), цифры и символ подчеркивания. Имя может не начинаться с цифры. Имя может начинаться с подчеркивания, но в таком случае оно должно содержать по меньшей мере еще один символ

Спасибо за помощь!

+1

Не совсем ясно, мольбы точно указать, что вывод, который вы ожидаете для данного входа. Я пытался что-то придумать, но я не уверен, что вам нужно. См. [Это демо] (https://regex101.com/r/rE5nF0/3). –

ответ

1

Описание

Принимая от Вашего regex101 Например, я не совсем ясно, на другие требования, так что я понимаю, что это не может полностью ответить на ваш вопрос.

"[^"]*"|((?=_[a-z_0-9]|[a-z])[a-z_0-9]+(?=\s*=)) 

Regular expression visualization

Это регулярное выражение будет делать следующее:

  • матчи кавычками
  • места имен переменных в Capture 1-й группы, вы можете перебирать массив совпадений тестирование группы захвата 1 для значения, если оно заполнено, то это имя.
  • требует имя переменной, чтобы начать либо с _ и, по меньшей мере, одного символа, или начать с аз
  • после первой буквы имена переменных могут содержать любое количество a-z_ или 0-9
  • имен переменных должны последовать = знак
  • любое количество пробелов может быть вокруг = знака

Пример

Демо

https://regex101.com/r/aT6sC4/1

Пример текста

name = "steve", bro = "4, hi = bye", lolwot = "wait wot" 

Образец Матчи

Обратите внимание, как группа захвата 1 содержит только имена переменных.

[0][0] = name 
[0][1] = name 

[1][0] = "steve" 
[1][1] = 

[2][0] = bro 
[2][1] = bro 

[3][0] = "4, hi = bye" 
[3][1] = 

[4][0] = lolwot 
[4][1] = lolwot 

[5][0] = "wait wot" 
[5][1] = 

Объяснение

NODE      EXPLANATION 
---------------------------------------------------------------------- 
    "      '"' 
---------------------------------------------------------------------- 
    [^"]*     any character except: '"' (0 or more times 
          (matching the most amount possible)) 
---------------------------------------------------------------------- 
    "      '"' 
---------------------------------------------------------------------- 
|      OR 
---------------------------------------------------------------------- 
    (      group and capture to \1: 
---------------------------------------------------------------------- 
    (?=      look ahead to see if there is: 
---------------------------------------------------------------------- 
     _      '_' 
---------------------------------------------------------------------- 
     [a-z_0-9]    any character of: 'a' to 'z', '_', '0' 
           to '9' 
---------------------------------------------------------------------- 
    |      OR 
---------------------------------------------------------------------- 
     [a-z]     any character of: 'a' to 'z' 
---------------------------------------------------------------------- 
    )      end of look-ahead 
---------------------------------------------------------------------- 
    [a-z_0-9]+    any character of: 'a' to 'z', '_', '0' 
          to '9' (1 or more times (matching the 
          most amount possible)) 
---------------------------------------------------------------------- 
    (?=      look ahead to see if there is: 
---------------------------------------------------------------------- 
     \s*      whitespace (\n, \r, \t, \f, and " ") 
           (0 or more times (matching the most 
           amount possible)) 
---------------------------------------------------------------------- 
     =      '=' 
---------------------------------------------------------------------- 
    )      end of look-ahead 
---------------------------------------------------------------------- 
)      end of \1 
---------------------------------------------------------------------- 
+0

Я хотел бы, чтобы он фиксировал как имя переменной, так и значение переменной, как в демонстрации, которую я предоставил. Я не совсем понимаю, как работает ваш пример, поэтому я не знаю, где разместить вторую группу захвата. Кроме того, мне нужно сопоставить что-то вроде [this] (https://regex101.com/r/qD8wF5/1), чтобы извлечь значение 4 ... Спасибо за помощь <3 –

+0

[Это демо] (https: // regex101.com/r/eJ3bK3/1) фиксирует имя переменной и ее назначенное значение. –

+0

Я бы сам изменил ваше регулярное выражение, если бы понял, но заметил следующие проблемы: 1) Он соответствует 'hi =' и 2), он не соответствует 'var1 = var2' (просто чтобы быть ясным, мне также нужно для соответствия переменной = переменной, не только строк или чисел, и 3) она не соответствует 'num = 5.0'. Большое спасибо за вашу помощь, я бы никогда этого не добился –

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