2009-03-27 4 views
22

Mam listę wpisów tekstowych, które użytkownik może wprowadzić do bazy danych i muszę zweryfikować te dane wejściowe za pomocą wyrażeń regularnych, ponieważ niektóre z nich są złożone. Jedno z pól musi mieć przerwy w liczbie (tj. 10, 12, 14, 16 ...). Moje pytanie brzmi: czy istnieje konstrukcja Regex, która pozwalałaby mi tylko dopasowywać przebiegi parzyste lub nieparzyste? Wiem, że mogę wyciągnąć tę wartość i wykonać kontrolę podziału, ale miałem nadzieję na to, jeśli to możliwe, do czystego rozwiązania Regex.Wyrażenie regularne w celu dopasowania tylko nieparzystej lub parzystej liczby

[Edytuj]

Roztwór I skończył przy użyciu tej sprawie został adaptację JaredPar s, ponieważ oprócz konieczności tylko nieparzyste lub wyrównuje Musiałem także ograniczyć przez zakres (czyli wszystkie liczby parzyste między 10-40). Poniżej kończy się Regex.

^[123] [02468] $

+0

{1} 's w regex są prawdopodobnie całkowicie zbędne, choć swoimi silnik regex może być inny niż mój. –

+0

To wyrażenie dopasuje liczby do 48. Jeśli chcesz ograniczyć je do 40, potrzebujesz:^[123] [02468] | 40 $ –

+1

A Chris ma rację: {1} w wyrażeniu regularnym jest czysty szum, nie materia, której smak regexu używasz. –

Odpowiedz

45

nieparzystych

"^\d*[13579]$" 

liczb parzystych

"^\d*[02468]$" 

Run sprzeczności z A, a potencjał separator spacje

"$\s*(\d*[13579]\s*,\s*)*\d*[13579]$" 

Run of Evens z oraz potencjał separator spacje

"$\s*(\d*[02468]\s*,\s*)*\d*[02468]$" 
+0

Jesteś naprawdę ** inteligentny ** –

1

Czy masz na myśli coś takiego:

/(\d*[02468](, *\d*[02468]))|(\d*[13579](, *\d*[13579]))/ 

lub jeden z trzech innych możliwych interpretacji pytanie jak brzmi?

+0

Myślę, że musisz również gwiazdkować drugą podgrupę w każdej grupie, nie? –

5

Regex nie jest zbyt trudny do zaprojektowania, jeśli weźmie się pod uwagę, że parzystą lub nieparzystą liczbę można przetestować, patrząc tylko na ostatnią cyfrę, która również musi być parzysta lub nieparzysta. Więc regex dla nieparzystej biegnie mogą być:

"^(\s*\d*[13579]\s*,)*(\s*\d*[13579]\s*)$" 

Wymień [13579] [02468] przez dla liczb parzystych ...