JavaScript Regex для соответствия математическому выражению

Мне нужна помощь с этим регулярным выражением:

let j = numberArray.join("").match(/^([\d]*\.{1,}[\d]+|[\d]+)|([-+*/](?=\.|[\d]))|\.[\d]+|[\d]+/g);

Вот критерии, которым мне нужно соответствовать:

  1. число не может иметь несколько десятичных знаков. Например, разрешены только такие числа, как .123 или 1.123, но не ...33 или 1.2.3.3.
  2. За оператором не может следовать один или несколько дополнительных операторов. Таким образом, пользователь не может последовательно вводить +, за которым следует *.

Пример ввода и здесь:

ввод: ..123+*/.4.3.5-+..3+123

даст результат: .123/.435+.3+123

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

Не считая того, что ..123, вероятно, следует рассматривать как ошибку, а не анализировать как 0.123 (то же самое с .4.3.5), у вас есть другие проблемы. Это приведет к некоторым странным двусмысленностям. Например, совсем не ясно, почему вы выбрали / вместо + или * в приведенном вами примере (в последовательности +*/) или почему вы полностью игнорируете знак -. В обычной математике -+3 будет -3, а не +3.

elixenide 09.12.2018 23:42

Чтобы упростить мой предыдущий комментарий: если определенные входы «не разрешены», такие как ...3 или +*, зачем пытаться разобраться в этих входах, а не отклонять их? много легче отклонить эти бессмысленные входные данные, а затем проанализировать любые приемлемые входные данные, чем пытаться разобраться в этой бессмыслице.

elixenide 09.12.2018 23:45
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
1 271
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Логика, вероятно, была бы проще, если бы вы выполнили эти операции по отдельности - сначала найдите числа с несколькими десятичными знаками и исправьте их, чтобы они содержали только первый десятичный знак, тогда находит повторяющиеся операторы и заменяет их последним оператором:

const clean = str => str
  // Match zero or more digits, followed by a decimal,
  // followed by more digit and decimal characters
  // For everything past the first decimal, replace decimals with the empty string
  .replace(
    /(\d*\.)([\d.]+)/g,
    (_, g1, g2) => g1 + g2.replace(/\./g, '')
  )
  // Match 2 or more operators, capture the last operator in a group
  // Replace with the last operator captured
  .replace(
    /([-+/*]){2,}/g,
    '$1'
  );
  
console.info(clean('..123+*/.4.3.5-+..3+123'));

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

Jawaka72 09.12.2018 23:47

Другие вопросы по теме