Regex - запретить определенным символам появляться последовательно - PullRequest
0 голосов
/ 21 сентября 2018

Я не уверен, возможно ли это или нет:

Написание программы для преобразования инфиксной записи в постфиксную запись.Пока все работает хорошо, но попытка реализовать проверку оказывается трудной.

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

  1. Строка должна начинаться только с цифры или ( (программа не допускает отрицательных чисел)
  2. Строка должна заканчиваться только цифрой или )
  3. Строка должна содержать только 0-9*/()-+
  4. Строка не должна позволять следующим символам появляться вместе +*/-

У меня есть регулярное выражение, соответствующее первым 3 правилам:

(^[0-9(])([0-9+()*]+)([0-9)]+$)

Возможно лииспользовать регулярное выражение для реализации последнего правила?

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Я согласен с Михалем Турчином, что регулярное выражение не является задачей для этого, но не с причиной.Это легко реализовать ваши ограничения.Однако ваши ограничения также допускают выражения типа (0+3, 2(*4), ((((1 и другие вещи, которые вам, вероятно, не нужны - поэтому проверка регулярных выражений бессмысленна.Если вы писали это с помощью механизма регулярных выражений с какой-то значительной мощью, такой как PCRE (Perl, PHP) или Onigmo (Ruby), вы можете подделать синтаксический анализатор в регулярном выражении;но в Java регулярное выражение довольно ограничено в том, что он может делать.Для требований, указанных в вопросе, этого достаточно:

^[0-9(](?:(?![+*/-][+*/-])[0-9+*/()-])*[0-9)]$
  • начинается с цифры или в скобках
  • любое количество повторений любого допустимого символа, такого, что этот символ иследующий символ не является обоими операторами
  • заканчивается цифрой или тезисом.
0 голосов
/ 21 сентября 2018

Я отвечу только на четвертое правило, так как у вас есть проблема только с ним.

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

Этот шаблон ^(?(?=.*\+)(?!.*[\*\/-])).+$ будет соответствовать любой строке, которая содержит + и не содержит других символов: /, *, -.Ведь один персонаж уже длинный и его трудно читать. См. Демонстрацию .

Используется условное выражение (?...), чтобы проверить, была ли проверка с предварительным просмотром для + успешной, если это так, то отрицательный прогноз гарантирует, что у вас не будет\*- символов.

Для всех символов регулярное выражение станет очень большим и сложным в обслуживании.

Именно поэтому я не рекомендую его для этой задачи.

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