Regex - kody pocztowe

0

Witam. Chce zapisać zweryfikować wzorzec kodów pocztowych. Użyłem regexa do weryfikacji ale nie wiem czy trochę nie przekombinowałem i być może da się prościej
Generalnie chodzi o to, że chce przyjąć wzorzec kodu pocztowego w formach np:

 4_-__ , _3-___ lub __-3__ , itd

Chodzi mi o wszystkie możliwe kombinacje. I Jeśli jest brak cyfry to ma być podłoga ( _ ).

 new Regex("(^(([0-9]{2})|([0-9]{1}[_]{1})|([_]{2})|([_]{1}[0-9]{1}))-(([0-9]{3})|([_]{1}[0-9]{2})|([_]{2}[0-9]{1})|([0-9]{1}[_]{1}[0-9]{1})|([0-9]{1}[_]{2})|([_]{1}[0-9]{1}[_]{1}))$)|(^(([0-9]{2})|([0-9]{1}[_]{1})|([_]{1}[0-9]{1}))-([_]{3}))");
3

[_]{1} to to samo co _
[_]{2} to __
[0-9]{1} to tyle co [0-9]

już po tych zamianach masz

new Regex("(^(([0-9]{2})|([0-9]_)|(__)|(_[0-9]))-(([0-9]{3})|(_[0-9]{2})|(__[0-9])|([0-9]_[0-9])|([0-9]__)|(_[0-9]_))$)|(^(([0-9]{2})|([0-9]_)|(_[0-9]))-(___))");

a nie mogą być wszystkie cyfry zamienione na _? Wtedy wyrażenie jest banalne

^[_0-9]{2}-[_0-9]{3}$

jeśli musi być cyfra to:

^([_0-9][0-9]|[0-9][_0-9])-([_0-9]{2}[0-9]|[_0-9][0-9][_0-9]|[0-9][_0-9]{2})$

4
^(4\d-\d\d\d|\d3-\d\d\d|\d\d-3\d\d}$
3

@obscurity: i @szydlak Wasze wyrażenia nie działaja dla przypadków testowych:
https://regex101.com/r/txU3DZ/5
https://regex101.com/r/60itWe/1
https://regex101.com/r/rJ3eoT/1

Jesli kod pocztowy ma formę: dd-ddd, to może by tak?:
https://regex101.com/r/rJ3eoT/2

5

ok już kumam - ma być minimum jedna cyfra obojętne po lewej czy po prawej stronie, w takim razie możesz użyć wyrażenia look-ahead

^(?=.*[0-9].*)([_0-9]{2}-[_0-9]{3})$

https://regex101.com/r/W451hm/1

0

@lion137:
^[_0-9]{2} - oznacza, że na początku mogą być: 2 cyfry lub dwie podłogi lub ich kombinacje?

1

Jak tak to może tak?:
https://regex101.com/r/rJ3eoT/3

2

A czemu to ma być regex? Użyj najprostszej formy, czyli ^([_0-9]{2})-([_0-9]{3})$, a resztę odwal split + if.

Jeśli to koniecznie ma być regex (co mi się wydaje bezsensowne), to proponuję zrobić look-ahead'a: https://regex101.com/r/uzqizP/2

PS: @obscurity: Ubiegłeś mnie, ale grupa jest niepotrzebna, i drugie .* jest niepotrzebne: ^(?=.*\d)[_0-9]{2}-[_0-9]{3}$

0

@TomRiddle: Regex może być i jak pokazałem bez look ahead sie obędzie, a i testowanie chyba szybsze niż, jak sugerujesz z ifem i splitem; tylko wydaje mi sie, że @szydlak nie wie czy ma być co najmniej jedna liczba czy nie.

0
lion137 napisał(a):

@TomRiddle: Regex może być i jak pokazałem bez look ahead sie obędzie, a i testowanie chyba szybsze niż, jak sugerujesz z ifem i splitem; tylko wydaje mi sie, że @szydlak nie wie czy ma być co najmniej jedna liczba czy nie.

Unit testy i tak nie powinny znać wewnętrznej implementacji. Z punktu widzenia testerskiego to może być nawet 1000x if/else, i unit test/tester nie powinien być tego w stanie odróżnić. Unit testy tak czy tak warto mieć.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0