是否有任何RegEx可以测试此场景。
正确示例: 1-50,51,52,55-60 1,2,3-10,12,20不正确的例子: 1-50,49,20,60 2,3,1-10
我应该为此编写单独的函数吗?
谢谢
发布于 2019-03-08 12:39:18
这是一个非正则表达式。您可以在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"))
发布于 2019-03-08 12:58:13
在这个任务中使用正则表达式是非常困难的。我认为更好的方法是使用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']));
https://stackoverflow.com/questions/55062694
复制相似问题