Регулярное выражение для проверки присвоения переменной

#php #regex

#php #регулярное выражение

Вопрос:

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

Присвоение переменной выглядит следующим образом

 [assign {var_name} = "string value"]
  

Вы можете назначить нескольким переменным, таким как

 [assign {var1} = {var2} = true]
  

Или добавьте к переменной с

 [assign {var_name} .= " more..."]
  

Увеличение / уменьшение переменных

 [assign {var}  ] or [assign {var}--]
  

Присвоить отрицательное значение

 [assign {var1} = !{var2}]
  

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

      /
       [assign
         (?:
           [s]*(?:
             [!]?{[^}] }(?:(?:  )|(?:--))?
             |
             [0-9] 
             |
             "[^"] "
             |
             '[^'] '
             |
             true
             |
             false
           )[s]*(?:=[s]*|.=[s]*)?
         ) 
       ]
     /
  

Я застрял со следующим:

  • Мне нужно убедиться, что .= или = используется между каждой частью
  • И убедитесь, что значения и переменные присваиваются переменным, но не переменным, присвоенным значениям
  • Наконец, убедитесь, что существует фактическое присвоение, если значение не увеличивается или не уменьшается

Обновление: рабочее регулярное выражение

        [assign(?:s)* 
         (
           {[^}] }
           (?:
               
             |
             --
             |
             (?:s)*(?:.)?=(?:s)*
             (?:(?:!)?{[^}] }(?:s)*(?:.)?=(?:s)*)*
             (?:
               [0-9] 
               |
               "[^"] "
               |
               '[^'] '
               |
               true
               |
               false
               |
               (?:!)?{[^}] }
             )
           )
         )
       (?:s)*]
  

Комментарии:

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

2. Я собираюсь преобразовать это в php, но это не язык шаблонов, прежде чем кто-либо перейдет на этот. Это язык, доступный конечным пользователям. Функциональность очень ограничена, что позволяет мне по существу проверять код перед преобразованием и анализом php. Проверка является обязательным требованием, поскольку пользователь не должен иметь возможности «ломать» вещи с помощью плохого кода.

Ответ №1:

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

 ^(?:assign {var.*?})(  |--| (?:.)?= ({var.*?} = )*(true|". "|!{var.*?}))$
  

Оно будет соответствовать следующему:

 assign {var_name} = "string value"
assign {var1} = {var2} = true
assign {var_name} .= " more..."
assign {var}  
assign {var}--
assign {var1} = !{var2}
assign {var235} = "two"
assign {var1} = {var2} = {var3} = true
  

И оно не будет соответствовать следующему:

 assign lol = hi
assign {var3} = {var4}
assign {var5} = !"hi"
  

Комментарии:

1. Количество назначений не ограничено, плюс ваше регулярное выражение позволило бы пропустить слишком много.

2. Это регулярное выражение допускает любое количество присвоений. Что он допускает, чего не должно быть? Я просто использовал все ваши примеры и добавил несколько своих.

3. Извините, я не совсем проснулся, когда впервые посмотрел на это. В основном это делает то, что мне нужно. Я обновил свой вопрос своим рабочим регулярным выражением для всего.