2014-12-18 10 views
5
^((?=.*[1-9]|0)(?:\d{1,3}))((?=.*\d)(?:\.\d{3})?)*((?=.*\d)(?:\,\d\d){1}?){0,1}$ 

Myślę, że to wyrażenie regularne jest bardzo długie i może być krótsze. Problem polega na tym, że nie jestem zbyt dobry w wyrażeniach regularnych, dlatego proszę o pomoc.Regex dla numeru waluty, Jak mogę napisać krótszy?

regex Online Tester http://regexr.com/3a3mk

Moje zasady:

  • Począwszy od 1, 2 lub 3 liczb dodatnich [1-9] lub 0.
  • Dodajesz tyle. (następnie 3 cyfry [0-9]), jak chcesz.
  • możliwość dodawania przecinek 2 liczb (jak po przecinku)

pozytywne wyniki

  • 0,55
  • 1,60
  • 10,70
  • 100,80
  • 1,10
  • 1,000
  • 1.000,20
  • 10,000
  • 10.000,03
  • 100,000
  • 100.000,08
  • 1,000. 000 000
  • 1.000.000.000,10

negatywne wyniki

  • 0,0
  • 1,1
  • 1.000
  • 1000,000
  • 0,000
  • 0.000,10
  • 1.000,1
  • 1.000,100
  • 1.0,00
  • 1.00,00
  • 1.000,0
  • 012,10
  • 012.123,10
  • A0
  • 0, A
  • 0 AA
  • 1.a00.00
  • 1.000.a1

[EDYCJA] Dodano więcej wyników negatywnych

+4

marginesie: to jest jak każde pytanie o regex powinien wyglądać. –

Odpowiedz

2

edycja:

^(0|[1-9][0-9]{0,2}(\.[0-9]{3})*)(,[0-9]{2})?$

mecze:

^ początek linii

[1-9] tylko jeden niezerowa cyfra

[0-9]{0,2} między 0 a 2 cyfr

(\.[0-9]{3})* zero lub więcej części okresu i 3 cyfr

(0 | [1-9][0-9]{0,2}(\.[0-9]{3})*) albo (i) zero lub (ii) do trzech cyfr (pierwsze nie zero), a następnie bloki zero lub więcej partii okresu, po którym następują trzy cyfry

(,[0-9]{2})? zero lub jedna partia przecinka i 2 cyfry

$ końca linii

+1

Nie obejmuje swoich pierwszych dwóch pozytywnych przykładów: 0 i 0,55 – Mainz007

+0

@ Mainz007. Słuszna uwaga. Mam nadzieję, że teraz naprawione. – Tony

+0

Tak usunięto downvote;) – Mainz007

1

Masz rację, twoja mowa jest trochę za długa. Krótsza wersja, która współpracuje z numerami przykład i specyfikacji daliście byłoby to:

^(0|\d{1,3})(\.\d{3})*(,\d{2})?$ 

Objaśnienie:

  • (0|\d{1,3}) sprawdza 0 lub 1 do 3 cyfr
  • (\.\d{3})* sprawdza dostępność kropka i 3 cyfry, ale z powodu * może również nie być żadnego z nich, ckecks dla przecinka i dwóch cyfr, ale znowu może pojawić się raz lub wcale.

Mam nadzieję, że to pomoże!

+2

Twój regex pasuje również do '000,55', nie jestem pewien, czy właśnie tego szuka OP ... – sp00m

+0

Niż to robi lewę. Ale jeśli tylko znalazłem pozytywny wynik, który powinien być negatywny (także w mojej wersji) akceptuje się 012/012,12 (zaczynając od 0 jest nie do przyjęcia) Więc idę z odpowiedzią @ sp00m, ponieważ on również to okrył! Wciąż kciuk w górę! – Marcel

+0

Tak, tak, brakowało tego ... – Mainz007

8

Poniższy powinna własnych potrzeb:

^(?:0|[1-9]\d{0,2})(?:\.\d{3})*(?:,\d{2})?$ 

Regular expression visualization

Wizualizacja autorem Debuggex

Demo na regex101

+1

chociaż twoja pokrywa również a23, 23, ale domyślam się, że tylko cyfry są sprawdzane ... – Mainz007

+1

@ Mainz007 Dobry połów! Uaktualniłem, dziękuję :) – sp00m

+1

BTW: Dzięki za pokazanie Debuggex;) – Mainz007

Powiązane problemy