2015-05-07 5 views
2

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

(anything >= anything) 

и там можно лишь на этих операторов сравнения:> = < = == = <> И они могут быть там только один раз!. То, что я это:

^\(.+(>=|<=|>|<|==|!=).+\)$ 

Но это соответствует таким вещам, как> = и так далее!. Я просмотрел вопросы stackoverflow и googled, но не смог найти правильное решение.

Не могли бы вы помочь мне в этом?

ответ

1

Регулярное выражение, например ^\(\s*[a-zA-Z0-9_+\-\/* ]+\s*(>=|<=|>|<|==|!=)\s*[a-zA-Z0-9_+\-\/* ]+\s*\)$, должно делать трюк, не так ли?

A Regex101 with it in action can be found here.

+0

Я боюсь, нет ... Под «ничего» я ​​имел в виду, что он также может быть следующим: (a + b> = a - g [i, j + d]) –

+0

А, я вижу. Я отредактировал свой пост соответственно. – GrandonBroseph

+0

удивительно, спасибо! –

1

Вы можете использовать следующее:

^\(((?!(>=|<=|>|<|==|!=)).)+\s+(>=|<=|>|<|==|!=)\s+((?!(>=|<=|>|<|==|!=)).)+\)$ 

Объяснение:

  • ((?!(>=|<=|>|<|==|!=)).)+ любой символ, кроме (>=|<=|>|<|==|!=)
  • \s+(>=|<=|>|<|==|!=)\s+ одного из операторов с последующим
  • ((?!(>=|<=|>|<|==|!=)).)+ любой символ, кроме (>=|<=|>|<|==|!=)
2

Если вы также планирует также захватывать строки как (myName == "Денис"), вам нужно использовать следующее регулярное выражение:

^\((?>(?![<>=]=|!=|[<>]).)*?(?:[<>=]=|!=|[<>])(?>(?![<>=]=|!=|[<>]).)*?\)$ 

См demo on Regexstorm (с поддержкой .NET вкус регулярных выражений, в отличие от regex101.com)

Это намного быстрее, чем предложение Karthik Manchala по результатам испытаний на http://regexhero.net, из-за использования atomic grouping (4444257997315627277850354) 078888), character classes ([<>=]), и и ленивое соответствие (*?). Кроме того, если пробел отсутствует до или после оператора ==, мое регулярное выражение все равно будет захватывать это выражение.

С (?m)^\((?>(?![<>=]=|!=|[<>]).)*?(?:[<>=]=|!=|[<>])(?>(?![<>=]=|!=|[<>]).)*?\)$ мое регулярное выражение дает 15 783 итераций в секунду, а Karthik's (?m)^\(((?!(>=|<=|>|<|==|!=)).)+\s+(>=|<=|>|<|==|!=)\s+((?!(>=|<=|>|<|==|!=)).)+\)$ дает 9204 итераций в секунду.

Смежные вопросы