#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. Да, вы можете указать символ или регулярное выражение, используя синтаксис разделения.