#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. Извините, я не совсем проснулся, когда впервые посмотрел на это. В основном это делает то, что мне нужно. Я обновил свой вопрос своим рабочим регулярным выражением для всего.