/ / Expression régulière qui correspond au format de date - regex, bison, flex-lexer

Expression RegEx correspondant au format de la date - regex, bison, flex-lexer

J'ai une ligne avec "1999-08-16"^^xsd:date. Quel sera le regex pour capturer la chaîne entière en tant que "1999-08-16"^^xsd:dateen fichier flex? Et, est-il possible de ne capturer que "1999-08-16" en tant que chaîne. Si oui, alors quelle sera la regex pour cela en flex?

Réponses:

0 pour la réponse № 1

Essaye celui-là:

^"(d{4}-(?:0?[1-9]|1[012])-(?:30|31|[12]d|0?[1-9]))"^^xsd:date$

Explication:

  • ^ - début de ligne
  • d{4} - partie d'année
  • (?:0?[1-9]|1[012]) - mois, peut être:
    • 01-09 ou 1-9 (c’est pourquoi 0?)
    • 10,11,12 (1[012] partie)
  • ?: signifie groupe non capturant (si nous avons juste besoin d'alterner les correspondances avec |, mais ne les renvoie pas à l'utilisateur)
  • (?:30|31|[12]d|0?[1-9]) - partie de jour, peut être:
    • 30,31,
    • 10-29 (partie [12]d)
    • 1-9 ou 01-09 (0?[1-9])
      Nous utilisons également un groupe non capturant pour la journée correspondante
  • $ correspond à la fin de la ligne
  • Tout entre "" est capturé dans un groupe de capture standard, car vous devez extraire la date

Démo

REMARQUER: Lorsque les jours correspondants, nous mettons 1-9 nombre de jours dans le DERNIER groupe alternant:

(?: 30 | 31 | [12] d |0? [1-9])

cela "parce que le moteur regex quand on donne des correspondances en alternance utilise le résultat correspondant PREMIER et que les autres alternatives correspondantes sont ignorées. Par exemple- en ficelle 1 11 expression:

  • (?:d{2}|d) donne 2 matches
  • (?:d|d{2}) donne 3 matches

0 pour la réponse № 2

Pour capturer une chaîne entière "[0-9]{4}-[0-9]{2}-[0-9]{2}"^^[^ ]* peut être utilisé.