Chcę napisać wyrażenie regularne, aby sprawdzić warunki kierunku wiatru. Chcę wejść od użytkownika czegoś takiego:

BETWEEN (45 AND 90) OR (270 AND 320)

BETWEEN i OR i OR są oczywiście słowo kluczowe mogą być wiele warunków w nawiasach () oddzielone OR

Na przykład:

BETWEEN (45 AND 90)

BETWEEN (45 AND 90) OR (270 AND 320)

BETWEEN (15 AND 40) OR (170 AND 200) OR (270 AND 320)

BETWEEN (45 AND 90) OR (270 AND 320) OR (220 AND 240) OR (270 AND 320)

Wartości liczbowe powinny wynosić od 0 do 360. Chcę dać opcję użytkownika do wprowadzania wielu warunków.

-1
AL̲̳I 3 październik 2012, 19:29

4 odpowiedzi

Najlepsza odpowiedź

Spróbuj tego:

/^BETWEEN \(([0-2]?[0-9]?[0-9]|3[0-5][0-9]|360) AND ([0-2]?[0-9]?[0-9]|3[0-5][0-9]|360)\)( OR \(([0-2]?[0-9]?[0-9]|3[0-5][0-9]|360) AND ([0-2]?[0-9]?[0-9]|3[0-5][0-9]|360)\))*$/

Jest to dość długi, ale upewnia się, że masz tylko OR między wiele kierunków, a nie na końcu lub początku. Numer długości również upewnij się, że masz numery tylko od 0 (lub 000) do 360.

Należy jednak wziąć pod uwagę, czy podzielanie ciągu w OR i AND może być prostszym rozwiązaniem.

1
Martin Ender 3 październik 2012, 15:50

Spowoduje to zatwierdzenie dopasowania linii między nawiasami. Zapewnia również, że liczby wynoszą od 0 do 360.

^BETWEEN(?:\s*(\((?:[0-2]?[0-9]?[0-9]|3[0-5][0-9]|360)\s+(?:AND)\s+(?:[0-2]?[0-9]?[0-9]|3[0-5][0-9]|360)\))\s*(?:(OR)(?!$))?)+$

SUKCES:

BETWEEN (45 AND 90)
BETWEEN (45 AND 90) OR (270 AND 320)
BETWEEN (15 AND 40) OR (170 AND 200) OR (270 AND 320)
BETWEEN (45 AND 90) OR (270 AND 320) OR (220 AND 240) OR (270 AND 320)

NIEPOWODZENIE:

BETWEEN (361 AND 90)
BETWEEN (15 AND 40) OR (170 AND 459) OR (270 AND 320)
BETWEEN (45 AND 90) OR (270 AND 320) OR (220 AND 240) OR (270 AND 320) OR
BETWEEN (45 AND 90) OR (270 AND 320) OR (220 AND 240) OR (270 AND 320) ORR
BETWEEN (45 AND 90) OR (270 AND 320) OR (220 AND 240) OR (270 AND 320) OR 

Wykorzystuje również z grup nie przechwytywania (?: ), dzięki czemu przechwytuje tylko (### AND ###).

2
CaffGeek 3 październik 2012, 18:44

To powinno załatwić sprawę

/BETWEEN ( ?\(\d+ (AND) \d+\)( OR)?)+/

0
Jordan Kaye 3 październik 2012, 15:32

Możesz użyć tego REGEX, aby potwierdzić dane ...

/BETWEEN (( OR )?\(\d+ AND \d+\))+/

EDYTUJ

Wykonywanie Single Regex, który rozwiązałby twój złożony wymóg, jest bardzo zły pomysł, ponieważ następnym razem, aby uzyskać dostęp do REGEX dla niektórych zmian, byłoby to bałagan.

Złam kod na różne części ...

1 & gt; sprawdź, czy jest w poprawnym formacie BETWEEN (( OR)? \((\d+) AND (\d+)\))+

2 & GT; teraz sprawdź indywidualne wartości, uzyskując dostęp do grup i porównaj je za pomocą prostego konstrukcji if-else

0
Anirudha 3 październik 2012, 16:08