Возможно ли написать регулярное выражение, которое может подтвердить простую математику? - PullRequest
2 голосов
/ 18 февраля 2010

Я использую коммерческое приложение, в котором есть возможность использовать RegEx для проверки форматирования поля. Обычно это работает довольно хорошо. Однако сегодня я столкнулся с проверкой следующих строк: буквенно-цифровые коды в кавычках с простыми арифметическими операторами (+ - / *). Очевидно, проблема заключается в том, что иногда пользователи добавляют дополнительные пробелы (например, «FLR01» вместо «FLR01») или имеют другие опечатки, такие как несовпадающие скобки, которые вызывают проблемы с последующей обработкой.

В первых примерах было добавлено 5 кодов:

"FLR01" + "FLR02" + "FLR03" + "FMD01" + "FMR05"

Итак, я начал идти по пути сопоставления 5 буквенно-цифровых символов, указанных в строках:

"[0-9a-Za-Z] {5}" [+ - * /]

Однако формулы быстро стали сложнее, и я не знаю, как обойти следующие осложнения:

  1. Мне нужно проверить один из четырех простых математических операторов (+ - * /) между каждым кодом, но не после последнего.
  2. Может быть добавлено любое количество кодов, а не только пять, как в примере выше.
  3. С круглыми скобками все в порядке («X» + «Y») / «2»
  4. Несоответствующие скобки не в порядке.
  5. Никакая формула (например, пробел) не подходит.

Действительно:

"FLR01"+"FLR02"+"FLR03"+"FMD01"+"FMR05"
"0XT"+"1SEAL"+"1XT"+"23LSL"+"23NBL"  
("LS400"+"LT400")*"LC430"/("EL414"+"EL414R"+"LC407"+"LC407R"+"LC410"+"LC410R"+"LC420"+"LC420R")

Invalid:

" FLR01" +"FLR02"
"FLR01"J"FLR02"
("FLR01"+"FLR02"

Это не то, что вы легко можете сделать с RegExp? Основываясь на ответе Джеффа на номер 230517, я подозреваю, что у меня не получается, по крайней мере, проблема «согласованного соединения». Даже частичное решение проблемы (например, пометка лишних пробелов, недопустимые операторы), вероятно, будет лучше, чем ничего, даже если я не смогу решить проблему с круглыми скобками. Предложения приветствуются!

Спасибо

Стивен

Ответы [ 2 ]

3 голосов
/ 18 февраля 2010

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

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

Что касается остального, как насчет этого?

("[0-9a-zA-Z]+"([+\-*/]"[0-9a-zA-Z]+")*)?

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

(\(*"[0-9a-zA-Z]+"\)*([+\-*/]\(*"[0-9a-zA-Z]+"\)*)*)?
1 голос
/ 18 февраля 2010

Вы можете легко использовать регулярные выражения, чтобы сопоставить свои токены (числа, операторы и т. Д.), Но вы не можете найти сбалансированные скобки. Это не слишком большая проблема, так как вам просто нужно создать конечный автомат, который будет работать с токенами, которые вы соответствуете. Если вы не знакомы с ними, подумайте об этом как о блок-схеме в вашей программе, где вы отслеживаете, где вы находитесь, и куда вы можете пойти. Вы также можете взглянуть на страницу Википедии .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...