/ / Wyrażenie RegEx, które będzie pasować do formatu daty - regex, bison, flex-lexer

Wyrażenie RegEx, które będzie pasować do formatu Date - regex, bison, flex-lexer

Mam linię z "1999-08-16"^^xsd:date. Jaki będzie regex, aby uchwycić cały ciąg jako "1999-08-16"^^xsd:datew pliku flex? I czy możliwe jest uchwycenie tylko "1999-08-16" jako łańcucha znaków. Jeśli tak, to jaki będzie regex dla niego w flex?

Odpowiedzi:

0 dla odpowiedzi № 1

Spróbuj tego:

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

Wyjaśnienie:

  • ^ - początek linii
  • d{4} - część roczna
  • (?:0?[1-9]|1[012]) - miesiąc, może być:
    • 01-09 lub 1-9 (to dlaczego 0?)
    • 10,11,12 (1[012] część)
  • ?: oznacza grupę niezapisującą (jeśli potrzebujemy tylko dopasowań naprzemiennych z |, ale nie wysyłając ich do użytkownika)
  • (?:30|31|[12]d|0?[1-9]) - część dzienna, może być:
    • 30,31,
    • 10-29 (część [12]d)
    • 1-9 lub 01-09 (0?[1-9])
      Również używamy grupy niezapisującej do dopasowania dnia
  • $ dopasowuje koniec linii
  • Wszystko pomiędzy "" jest przechwytywany do standardowej grupy przechwytywania, ponieważ musisz wyodrębnić datę

Próbny

OGŁOSZENIE: Kiedy dopasowujemy dni, które kładziemy 1-9 Numery dni w LAST przemiennej grupie:

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

dzieje się tak, ponieważ silnik wyrażeń regularnych, gdy podane są dopasowania naprzemienne, używa PIERWSZEGO dopasowanego wyniku, a inne dopasowane alternatywy są ignorowane. w ciąg 1 11 wyrażenie:

  • (?:d{2}|d) daje 2 mecze
  • (?:d|d{2}) daje 3 mecze

0 dla odpowiedzi nr 2

Aby uchwycić cały ciąg "[0-9]{4}-[0-9]{2}-[0-9]{2}"^^[^ ]* może być użyte.