singlepost

помогите составить регулярное выражение << На главную или назад  

Гуры, помогите, кто-нибудь
необходимо составить регулярное выражение
в строку могут быть введены неравенства(двусторонние или односторонние), объединённые логическими И или ИЛИ
в выражениях могут присутвовать числа с плавающей точкой

это если знаки будут слева,
[0-9]*[.]*[0-9]*[>,<][=]* (выражение с неизвестным x)
а могут быть и справа, а ещё и слева и справа
но хоть один хоть где-нибудь д.б.

а ещё таких неравенств может быть много и они могут быть объединены И, ИЛИ

и по уравнению тоже вопрос:
как записать что там могут присутствовать знаки +,-,*,/, числа и выражения {K[0-9]{1,2}} + вопрос по поводу экранирования {

заранее спасибо :)

16 ответов в теме “помогите составить регулярное выражение”

  1. 16
    Денис Федоренко ответил:

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

  2. 15
    Наталия Кобзар ответил:

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

  3. 14
    Евгений кросовкин ответил:

    для составления регулярок мне помогает прога regex coach

  4. 13
    Леонид Максимов ответил:

    или прочитает и ему понравится :)

  5. 12
    Катя Зайцева ответил:

    гг) у них авторитет среди других коллег лучше прокачан ;-)
    а так – все имеют право на ошибку, я не злая)

  6. 11
    Василий Some ответил:

    как-то так. не проверял естестно ;)

    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 наверное посмотрел…

  7. 10
    Василий Some ответил:

    с коллегами иногда полезно поспорить
    ибо может коллега легко и непринужденно читает такие регэкспы, или по-другому подойдет к его написанию…

    а может скажет "о да, я был неправ" ;)

  8. 9
    Катя Зайцева ответил:

    да нет, не обязательно)
    у меня и было вначале что-то вроде парсера
    но более опытный коллега сказал написать регэксп)
    вот решила с ними наконец-таки разобраться)

  9. 8
    Денис Федоренко ответил:

    > более опытный коллега сказал написать регэксп)

    Гнать взашей надо таких коллег :)

  10. 7
    Василий Some ответил:

    тогда присоединяюсь к #2 – не надо такое проверять регэкспом
    написать регэксп можно, но получится дофига нечитабельно

    или невзирая ни на что нужно написать именно через регэксп?

  11. 6
    Катя Зайцева ответил:

    спасибо огромное
    задание чуть-чуть другое, но всё равно стало намного понятнее)

    там во вводе должно быть что-то типа

    ((0 < x + 5 > 120.4) AND (-4 < x + 78)) OR ( x > 5)

  12. 5
    Василий Some ответил:

    для выражения вида
    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]*\)+\)*

    в емаксе работает
    сорри если не так понял задание…

  13. 4
    Катя Зайцева ответил:

    сорри, я невнимательно прочитала)
    вы НЕ рекомендуете их использовать)
    понятненько

  14. 3
    Денис Федоренко ответил:

    Ну ваще-то я вам предложил конструктивный выход из ситуации, вместо того чтоб трахать мозг себе и другим.
    В качестве парсера лучше реализовать конечный автомат.
    Как частный случай: постфиксная форма выражения (может не совсем то, но тоже должно подойти). При ее составлении можно будет отловить все ошибки в синтаксисе + появится хорошая возможность учитывать баланс скобок.

  15. 2
    Катя Зайцева ответил:

    Денис, я тоже так думаю, но вопрос был слегка в другом) спасибо за рекомендацию :D

  16. 1
    Денис Федоренко ответил:

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

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.