Existe-t-il une RegEx pouvant tester ce scénario.

  1. Chaîne avec un nombre séparé par des virgules où le nombre de gauche doit être inférieur à celui de droite. Exemple correct : 1,2,3 4,10,20 Exemple incorrect : 3,2,1 4,1,20

  2. La chaîne peut avoir - un séparateur comme 1-25, où la gauche doit être plus petite que la droite et la chaîne ne doit pas avoir de nombre entre cette plage.

Exemple correct : 1-50,51,52,55-60 1,2,3-10,12,20 Exemple incorrect : 1-50,49,20,60 2,3,1-10,11

Dois-je écrire une fonction séparée pour cela?

Merci

0
Praveen Rawat 8 mars 2019 à 14:52

2 réponses

Meilleure réponse

Voici une solution sans regex. Vous pouvez split les numéros à , puis sort en fonction de leur valeur numérique. Utilisez la valeur Max si la valeur est une plage. Puis join le tableau trié. Vérifiez si la chaîne résultante est la même que la chaîne d'origine

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"))
2
adiga 8 mars 2019 à 12:39

L'utilisation d'une expression régulière pour cette tâche serait vraiment difficile. Je pense qu'une meilleure approche consiste à le faire en utilisant 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']));
1
jo_va 8 mars 2019 à 12:58