有没有可以测试这种情况的RegEx。
带有逗号分隔数字的字符串,其中左数字应小于右数字。 正确的示例:1,2,3 4,10,20 错误的示例:3,2,1 4,1,20
字符串可以有-分隔符,例如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
我应该为此编写单独的函数吗?
谢谢
答案 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']));