J'ai écrit une expression régulière coldfusion pour faire correspondre les heures de la journée dans le code source d'une page dans laquelle elles apparaissent dispersées sur la page comme ceci:

<span>10.30</span> stuff <span>10.45-11.15</span> other stuff <span>17.00</span>

Je veux que les correspondances soient "10.30", "10.45-11.15" et "17.00". Au lieu de cela, j'obtiens "10.30" "10.45" "11.15" et "17.00".

J'ai essayé:

rematch("(\b[0-2][0-9]\.[0-5][0-9]\b)|(\b[0-2][0-9]\.[0-5][0-9]-[0-2][0-9]\.[0-5][0-9]\b)",mystring)

Merci d'avoir corrigé mon erreur! Sûrement quelque chose à voir avec les petits b et le trait d'union.

2
Commata 16 janv. 2017 à 17:47

2 réponses

Meilleure réponse

Je ne pense pas que vous ayez besoin du 'ou', rendez simplement la plage facultative comme suit:

\b[0-2]\d\.[0-5]\d(-[0-2]\d\.[0-5]\d)?\b

Voici l'extrait de code équivalent JavaScript:

var re = /\b[0-2]\d\.[0-5]\d(-[0-2]\d\.[0-5]\d)?\b/g;
var s = "<span>10.30</span> stuff <span>10.45-11.15</span> other stuff <span>17.00</span>";

console.log(s.match(re));
2
wdosanjos 16 janv. 2017 à 14:57

Vous pouvez simplement rendre facultative la partie du modèle qui correspond à la deuxième partie de la plage à l'aide d'un groupe facultatif non capturant (?:...)? et noter que votre expression régulière correspond également à 29 heures qui peuvent également être corrigées.

Utilisation

\b(?:2[0-3]|[0-1][0-9])\.[0-5][0-9](?:-(?:2[0-3]|[0-1][0-9])\.[0-5][0-9])?\b

Voir la démo regex

Détails :

  • \b - limite de mot en tête
  • (?:2[0-3]|[0-1][0-9]) - soit 2 suivi d'un chiffre de 0 à 3 ou 0 / 1 suivi d'un chiffre (= heure)
  • \. - un point littéral
  • [0-5][0-9] - un chiffre de 0 à 5 suivi d'un chiffre (= minute)
  • (?:-(?:2[0-3]|[0-1][0-9])\.[0-5][0-9])? - un groupe facultatif non capturant correspondant à un -, puis le même modèle décrit ci-dessus suivi de ...
  • \b - une limite de mot de fin.
3
Wiktor Stribiżew 16 janv. 2017 à 14:52