RegEx для проверки диапазона и приращения - PullRequest
0 голосов
/ 08 марта 2019

Есть ли RegEx, который может проверить этот сценарий.

  1. Строка с запятыми, где номер слева должен быть меньше, чем справа. Правильный пример: 1,2,3 4,10,20 Неверный пример: 3,2,1 4,1,20

  2. Строка может иметь - разделитель типа 1-25, где слева должно быть меньше, чем справа, и строка не должна иметь число между этим диапазоном.

Правильный пример: 1-50,51,52,55-60 1,2,3-10,12,20 Неправильный пример: 1-50,49,20,60 2,3,1-10,11

Должен ли я написать отдельную функцию для этого?

Спасибо

Ответы [ 2 ]

2 голосов
/ 08 марта 2019

Вот решение без регулярных выражений. Вы можете split числа в ,, а затем sort их на основе их числового значения. Используйте значение Макс. , если значение является диапазоном. Тогда join отсортированный массив. Проверьте, совпадает ли полученная строка с исходной строкой

const getMaxValue = str => str.includes("-") ? +str.split("-")[1] : +str;

const checkInOrder = str => str === str.split(",")
                                  .sort((a,b) => getMaxValue(a) - getMaxValue(b))
                                  .join(",")

console.log(checkInOrder("1,2,3,4,10,20"))
console.log(checkInOrder("3,2,1,4,1,20"))
console.log(checkInOrder("1-50,51,52,55-60"))
console.log(checkInOrder("1,2,3-10,12,20"))
console.log(checkInOrder("1,2,3-10,12,20"))
console.log(checkInOrder("1-50,49,20,60,2,3,1-10,11"))
1 голос
/ 08 марта 2019

Использовать регулярное выражение для этой задачи было бы действительно сложно. Я думаю, что лучше сделать это с помощью JavaScript:

const isValid = arr => {
  const items = [];
  const ranges = [];
  const inRange = (range, x) => x >= range.start && x <= range.end;
  
  for (let i = 0; i < arr.length; ++i) {
    const x = +arr[i];
    const rangeParts = /(\d+)\s*-\s*(\d+)/.exec(arr[i]);
    if (rangeParts) {
      const range = { start: +rangeParts[1], end: +rangeParts[2] };
 
      const validRange = range.start < range.end &&
        ranges.every(r => range.start > r.end || range.end < r.start);
      if (!validRange) return false;
      
      const itemsInRange = items.some(item => inRange(range, item));
      if (itemsInRange) return false;
      
      ranges.push(range);
    }
    const inRanges = ranges.some(r => inRange(r, x));
    if (inRanges) return false;

    if (i > 0 && items[items.length-1] >= x) return false;
    
    items.push(x);
  }
  return true;
};

console.log(isValid(['1', '2', '3', '4']));
console.log(isValid(['1', '2', '3', '4', '5-7']));
console.log(isValid(['1', '2', '3', '4', '5-7', '1-3']));
console.log(isValid(['1', '2', '3', '4', '5-7', '7-8']));
console.log(isValid(['1', '2', '3', '4', '5-7', '8-10']));
console.log(isValid(['1', '20', '3', '4', '5-7', '8-10']));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...