Каким будет регулярное выражение для получения числа перед символом% в строке? - PullRequest
0 голосов
/ 19 апреля 2009

Я использую математический парсер, который использует% в качестве символа мода. Вместо этого я хотел бы использовать его для символа процента, чтобы пользователи могли вводить «25% * 10» или «25% из 10» и получать ответ «2,5» (они могли вводить что угодно).

Затем я использовал бы регулярное выражение, запрошенное для получения «25%» (может быть в любой части строки), и сделал бы простое вычисление (25/100), а затем заменил 25% в строке на вычисленное значение для передачи в математический анализатор. В основном, я делаю некоторые предварительные вычисления числа перед символом процента, прежде чем передать всю строку в математический анализатор.

Я всегда боролся с регулярными выражениями и надеялся, что кто-нибудь сможет мне помочь.

Спасибо

Ответы [ 2 ]

6 голосов
/ 19 апреля 2009

Самый простой способ - разделить математический парсер:

s/([0-9.]+)%/($1\/100)/g

Что просто заменяет «25%» на «(25/100)» ... так что если пользователь введет «25%*10», у него теперь будет «(25/100)*10», что при оценке дает правильный ответ.

Кроме того, в Perl вы можете сделать:

s{([0-9.]+)%}{$1/100}eg

, который заставил бы Perl вычислить деление на сотню и передать его математическому анализатору

1 голос
/ 19 апреля 2009

Регулярное выражение для поиска числа перед знаком «%»: /(\d+)%/.

Однако математические выражения не являются регулярным языком, поэтому регулярное выражение, вероятно, не является правильным инструментом. Вместо этого вы должны указать вашему парсеру интерпретировать "%" как "возьмите все, что будет до этого, и разделите его на 100". «Все, что предшествует этому» может быть любым математическим выражением, и вы не столкнетесь с проблемами приоритета операторов, соответственно. Вы можете разобраться в них в синтаксическом анализаторе дерева.

Смешивание подстановки текста с реальными языковыми функциями часто нарушает принцип наименьшего удивления. Когда пользователь видит, что «%» делит все, что раньше, на 100, он может попытаться использовать выражения типа (23+42)%, но это приведет к синтаксической ошибке. Кроме того, вам нужно более сложное регулярное выражение, если у вас есть что-то вроде 1.34e-14%, но эти вещи просто рассортируются при использовании синтаксического анализатора дерева.

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