Обработка строки математического уравнения с помощью регулярного выражения

#javascript #regex

#javascript #регулярное выражение

Вопрос:

У меня есть выражение, которое всегда будет соответствовать этой форме:

переменная — 25,6 вещь

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

Кстати, я использую движок javascript. Вот что у меня есть до сих пор.

 /(d .?d |w )(?:[ -*/])(d .?d |w )/
 

Это работает для следующего:

переменная переменная 25,6 25,6

Но это не удается, если я расширяю до более чем одного оператора:

переменная 25,6 other_variable …

Я пытался

 /((d .?d |w )(?:[ -*/])) (d .?d |w )/
 

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

переменная

поэтому я не уверен, почему он соответствует оператору, даже если он находится в пассивной группе.

Обновить

переменной может быть любой текст. Это просто все, что соответствует классу w . Таким образом, может совпадать все, что является десятичным (с или без .) или словом. Любой из четырех операторов может находиться между переменными / числами. Я просто не хочу, чтобы операторы были захвачены, только убедитесь, что они есть.

Комментарии:

1. (?:) Группа отличается от только () тем, что она не сохраняет соответствующую часть. На самом деле это не «пассивный» в любом другом смысле.

2. Не проще ли было бы разделиться на операторов?

3. Не могли бы вы подробнее рассказать о том, что должно совпадать, а что нет? Что действительно для variable thing части и? Что для них недействительно? В начале вы сказали, что выражение всегда подходит variable-25.6 thing , но позже у вас есть variable 25.6 thing .

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

5. @relynt: Plus I thought a regex exercise would be good. : теперь у вас две проблемы!

Ответ №1:

Рассмотрите split возможность использования этих операторов вместо того, чтобы пытаться сопоставить каждый подшаблон.

 var r = 'variable 25.6-other_variable/21.44*44.10'.split(/[ */-]/);
console.log(r); //=> [ 'variable', '25.6', 'other_variable', '21.44', '44.10' ]
 

Комментарии:

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

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