Удалить дубликаты номеров и операторов из строки - PullRequest
3 голосов
/ 14 февраля 2010

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

Например, строка типа «2 7 + * 3 * 95» должна быть преобразована в «2 + 3 * 9», а затем оценена как 29.

Вот что у меня есть:

expression.slice!(/ /) # Remove whitespace
expression.slice!(/\A([\+\-\*\/]+)/) # Remove operators from the beginning
expression.squeeze!("0123456789") # Single digit numbers (doesn't work)
expression.squeeze!("+-*/") # Removes duplicate operators (doesn't work)
expression.slice!(/([\+\-\*\/]+)\Z/) # Removes operators from the end

puts eval expression

К сожалению, это не делает однозначные числа и не удаляет дубликаты операторов, как я ожидал. Есть идеи?

Ответы [ 2 ]

2 голосов
/ 14 февраля 2010
"2 7+*3*95".gsub(/([0-9])[0-9 ]*/, '\1').gsub(/([\+\*\/\-])[ +\*\/\-]+/, '\1')

Первое регулярное выражение обрабатывает однозначную вещь, а второе - операторы повтора. Вы могли бы, вероятно, сжать это в одно регулярное выражение.

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

0 голосов
/ 14 февраля 2010
DATA.each { |expr| 
    expr.gsub!(%r'\s+', '')
    expr.gsub!(%r'([*/+-])[*/+-]+',  '\1')
    expr.gsub!(%r'(\d)\d+', '\1')
    expr.sub!(%r'\A[*/+-]+', '')
    expr.sub!(%r'[*/+-]+\Z', '')
    puts expr + ' = ' + eval(expr).to_s
}

__END__
2 7+*3*95
+-2 888+*3*95+8*-2/+435+-
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...