2011-08-18 4 views
5

obecnie używam ([1-9]|1[0-2]) do reprezentowania wejść od 1 do 12 (prowadząca zer nie dozwolony.)Jak przedstawiać zakresy liczb regex (np. Od 1 do 12)?

Jednak wydaje się raczej hacky, a na kilka dni to wygląda wręcz brudne.

☞ Czy istnieje wbudowany właściwy, aby to zrobić?

☞ Jakie są inne sposoby przedstawiania zakresów numerów?

+0

Jeśli "Większy jest lepszy", wtedy (1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12) byłoby lepiej. – Ingo

+0

@Ingo, aby być szczerym, że nie przekroczył moje myśli przed – Pacerier

+0

, ale jest to w pewnym sensie najprostsze rozwiązanie i daje wskazówkę, co prawdopodobnie chcesz: numery miesięcy? – Ingo

Odpowiedz

4

staram się iść z formularzami takimi jak [2-9]|1[0-2]?, które pozwalają uniknąć cofania, ale nie ma to większego znaczenia. Zostałem uwarunkowany przez Schemat XML, aby uniknąć takich "niejednoznaczności", nawet jeśli regex poradzi sobie z nimi dobrze.

+0

Zasadniczo, gdy matcher widzi znak "1", "znaczenie" jest niejednoznaczne, dopóki nie zobaczy więcej postaci. Czy jest to "1" dla [1-9] czy "1" dla 1 [0-2]? Regex nie dba o znaczenie, ale wciąż jest to problem związany z wydajnością, ponieważ matcher musi utrzymywać obie gałęzie aktywne, dopóki nie rozwiąże się dwuznaczności. – xan

+0

, więc mówisz w oczach maszyny regex, że to najszybsze rozwiązanie: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12? – Pacerier

+0

Nie, nie porównuję '[2-9]' z '2 | 3 | 4 | 5 | 6 | 7 | 8 | 9' - nie wiem, który jest szybszy. Porównuję '1 | 10' z' 10? '. Nie znaczy to, że stanie się to dla tak trywialnego przykładu, ale dla bardziej zaangażowanych wyrażeń regularnych pomoże usunąć wspólne przedrostki rozgałęzień. Być może lepszym przykładem: 'ab | ac' poprawiono do' a (b | c) '. – xan

8

Tak, poprawna:

[1-9]|1[0-2] 

przeciwnym razie nie dostaniesz 10.

+0

heys zobacz moje edytowane pytanie – Pacerier