0
votes

Regex pour vérifier le format de chaîne HSL

Je voudrais créer deux regex qui vérifient ces deux types de chaînes: xxx pré>

donc: p>

  • Nombre compris entre 0 et 259, Symbole degré, virgule, espace optionnel Li>
  • nombre compris entre 0 et 100, le pourcentage de symbole, virgule, espace optionnel li>
  • nombre compris entre 0 et 100, symbole pourcentage li> ul>

    et le même mais avec environ HSL (...) code> p>

    Exemples: p>

    const regexSimpleFormat = /(hsl\() (([0 - 9] | [1 - 9][0 - 9] | [1 - 2][0 - 5][0 - 9]) °) (, [] ?)(([0 - 9] | [1 - 9][0 - 9] | 100) %)(, [] ?)(([0 - 9] | [1 - 9][0 - 9] | 100) %)(\))/gi
    
    console.log(regexSimpleFormat.test('hsl(22°, 79%, 52%)')) // should be true
    console.log(regexSimpleFormat.test('hsl(02°, 79%, 52%)')) // should be false


3 commentaires

Votre dernier exemple non valide HSL (259 °, 100%, 100%) contredit le deuxième exemple que vous avez donné pour les chaînes HSL (322 °, 79%, 52%, 52%) .


Normalement, je voudrais juste grapper les chiffres, convertir en chiffres, puis vérifier s'ils sont à portée de distance. En outre, vous avez beaucoup d'espaces dans votre regex - ils importent!


Les deux derniers exemples «non valides» apparaissent également comme des exemples «valides» également. Je soupçonne que vous avez eu l'intention de "couper-coller-éditer" mais a été distrait après les deux premières étapes et j'ai oublié de terminer la dernière étape.


3 Réponses :


0
votes

Même si les espaces pourraient rendre votre regex un peu plus lisible, ils le font échouer. De plus, HSL code> avec les crochets doit être facultatif. J'ai également changé le type que vous recherchez des espaces et définis, que la dernière partie devrait se produire deux fois pour éviter les répétables dans la regex.

^ (hsl \ ()? \ S * (([0-9] | ([1-9] [0-9]) | ([1-2] [0-5] [0-9])) Â °) ((, \ s *) (([0-9] | [ 1-9] [0-9] | (100))%)) {2} \)? Code> => https://regex101.com/r/TYR2W2/2 P>

En réalité, je vous recommanderais davantage de saisir les chiffres, puis de vérifier la plage via JS. Il est plus lisible et plus facile à comprendre et à déboguer. P>

p>

259°, 79%, 52%)
hsl(259°, 79%, 52%"


1 commentaires

Voir le commentaire de @ Cyborg86PL sur une autre question.



0
votes

une regex possible pour cela:

^ (hsl \ ()? (2 [0-5] [0-9] | 1 [0-9] {2} | [1-9] [0-9] | [0-9]) Â °, \ S? (100 | [1-9] [0-9] | [0-9])%, \ S? (100 | [1-9 ] [0-9] | [0-9])% \)? $ Code> p>

p>

const regexSimpleFormat = /^(hsl\()?(2[0-5][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])°,\s?(100|[1-9][0-9]|[0-9])%,\s?(100|[1-9][0-9]|[0-9])%\)?$/gi

console.log(regexSimpleFormat.test('hsl(22°, 79%, 52%)')) // should be true
console.log(regexSimpleFormat.test('hsl(02°, 79%, 52%)')) // should be false
  • (hsl ()? strong> match "HSL (" 0 ou 1 fois; Li>
  • (2 [0-5] [0-9] | 1 [0-9] {2} | [0-9] [0-9] | [0-9]) strong> : correspond à des matchs entre 0 et 259, ne permettant pas les zéros de rembourrage gauche; li>
  • Â °, \ s? strong> Matchs μ °, et 0 ou 1 espace; Li>
  • (100 | [1-9] [0-9] | [0-9]) strong> correspond entre 0 et 100, ne permettant pas de faire des zéros de rembourrage à gauche; li> ul> p>


1 commentaires

Pour rendre HSL () en option, vous devez utiliser logique ou pour les deux cas. Sinon 259 °, 79%, 52%) ou HSL (259 °, 79%, 52%, 52% " Les exemples correspondront également.



0
votes

Vous pouvez utiliser l'expression régulière suivante.

(?<!\()   negative lookbehind asserts match is not preceded by '('
\b        match a word boundary
(?:\d|[1-9]\d|[1-2]\d{2}|3[0-5]\d|360)
          match an integer 0-360 converted to a string
°         match character
(?:       begin a non-capture group
  , ?     match a comma optionally followed by a space
  (?:[0-9]|[1-9]\d|100)
          match an integer 0-100 converted to a string
  %       match character   
)         end non-capture group
{2}       execute non-capture group twice
(?!\))    negative lookahead asserts match is not followed by ')'
|         or
\bhsl\(   match 'hsl(' preceded by a word boundary
(?:\d|[1-9]\d|[1-2]\d{2}|3[0-5]\d|360)°(?:, ?(?:[0-9]|[1-9]\d|100)%){2}
          as above
\)        match ')'


0 commentaires