正则表达式用于范围和增量检查

时间:2019-03-08 11:52:12

标签: javascript regex

有没有可以测试这种情况的RegEx。

  1. 带有逗号分隔数字的字符串,其中左数字应小于右数字。 正确的示例:1,2,3 4,10,20 错误的示例:3,2,1 4,1,20

  2. 字符串可以有-分隔符,例如1-25,其中left应该小于right,并且字符串在此范围内不应有数字。

正确的例子:1-50,51,52,55-60 1,2,3-10,12,20 错误的示例:1-50,49,20,60 2,3,1-10,11

我应该为此编写单独的函数吗?

谢谢

2 个答案:

答案 0 :(得分:2)

这是一个非正则表达式的解决方案。您可以split ,处的数字,然后根据其数值sort对其进行join。如果值是一个范围,请使用 Max 值。然后{{3}}排序数组。检查结果字符串是否与原始字符串相同

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 :(得分:1)

使用正则表达式执行此任务确实非常困难。我认为一种更好的方法是使用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']));