Гуры, помогите, кто-нибудь
необходимо составить регулярное выражение
в строку могут быть введены неравенства(двусторонние или односторонние), объединённые логическими И или ИЛИ
в выражениях могут присутвовать числа с плавающей точкой
это если знаки будут слева,
[0-9]*[.]*[0-9]*[>,<][=]* (выражение с неизвестным x)
а могут быть и справа, а ещё и слева и справа
но хоть один хоть где-нибудь д.б.
а ещё таких неравенств может быть много и они могут быть объединены И, ИЛИ
и по уравнению тоже вопрос:
как записать что там могут присутствовать знаки +,-,*,/, числа и выражения {K[0-9]{1,2}} + вопрос по поводу экранирования {
заранее спасибо
20 февраля 2010 в 0:03
Наталья, писать синтаксический парсер на регулярках в большинстве случаев бред, это вам любой разработчик скажет.
Да, регулярки мощный инструмент, не спорю, но к данной задаче инструмент неприменимый (исходя из здравого смысла).
20 февраля 2010 в 0:00
Я не согласна с Вами, Денис Федоренко, ибо многие описывают, что регулярка мощный инструмент… В моей практике многое решалось бы более практично благодаря регулярным выражениям, изучением коих намереваюсь заняться…
15 февраля 2010 в 23:01
для составления регулярок мне помогает прога regex coach
15 февраля 2010 в 20:03
или прочитает и ему понравится
15 февраля 2010 в 17:01
гг) у них авторитет среди других коллег лучше прокачан
а так – все имеют право на ошибку, я не злая)
15 февраля 2010 в 17:01
как-то так. не проверял естестно
numbers \(-?[0-9]+\.?[0-9]*\)
spaces \( \)
comparisons\(<\|>\|<=\|>=\|=\)
bool\(AND\|OR\)
symbol \([a-zA-Z]+\)
variable \(numbers+\+symbol+\|symbol+-numbers+\)
expr(\(numbers+spaces*comparisons+spaces*variable+\)+\(spaces*comparisons+spaces+ numbers+\)*)
bool \(AND\|OR\)
(?\(expr+bool+expr+\))?\((?\(bool+expr+\))?\)*
я бы на lex наверное посмотрел…
15 февраля 2010 в 17:01
с коллегами иногда полезно поспорить
ибо может коллега легко и непринужденно читает такие регэкспы, или по-другому подойдет к его написанию…
а может скажет "о да, я был неправ"
15 февраля 2010 в 17:00
да нет, не обязательно)
у меня и было вначале что-то вроде парсера
но более опытный коллега сказал написать регэксп)
вот решила с ними наконец-таки разобраться)
15 февраля 2010 в 17:00
> более опытный коллега сказал написать регэксп)
Гнать взашей надо таких коллег
15 февраля 2010 в 16:05
тогда присоединяюсь к #2 – не надо такое проверять регэкспом
написать регэксп можно, но получится дофига нечитабельно
или невзирая ни на что нужно написать именно через регэксп?
15 февраля 2010 в 16:04
спасибо огромное
задание чуть-чуть другое, но всё равно стало намного понятнее)
там во вводе должно быть что-то типа
((0 < x + 5 > 120.4) AND (-4 < x + 78)) OR ( x > 5)
15 февраля 2010 в 16:03
для выражения вида
12 <= 12.555 > 9.888 >= 5.22
используем такие регекспы
numbers \([0-9]+\.?[0-9]*\)
spaces \( \)
comparisons\(<\|>\|<=\|>=\|=\)
валидны только такие сочетания
(numbers+spaces*comparisons+spaces*numbers+)+ (spaces*comparisons+spaces+ numbers+)*
т.е.
\(\([0-9]+\.?[0-9]*\)+\( \)*\(<\|>\|<=\|>=\|=\)+\( \)*\([0-9]+\.?[0-9]*\)+\)+\(\( \)*\(<\|>\|<=\|>=\|=\)+\( \)*\([0-9]+\.?[0-9]*\)+\)*
в емаксе работает
сорри если не так понял задание…
15 февраля 2010 в 15:03
сорри, я невнимательно прочитала)
вы НЕ рекомендуете их использовать)
понятненько
15 февраля 2010 в 15:02
Ну ваще-то я вам предложил конструктивный выход из ситуации, вместо того чтоб трахать мозг себе и другим.
В качестве парсера лучше реализовать конечный автомат.
Как частный случай: постфиксная форма выражения (может не совсем то, но тоже должно подойти). При ее составлении можно будет отловить все ошибки в синтаксисе + появится хорошая возможность учитывать баланс скобок.
15 февраля 2010 в 15:01
Денис, я тоже так думаю, но вопрос был слегка в другом) спасибо за рекомендацию
15 февраля 2010 в 15:00
Для такой задачи я бы вам не рекомендовал использовать регулярные выражения.