2013-07-17 25 views
8

Tak więc, próbowałem napisać wyrażenie regularne o wartości typu opór, która zawiera pewną liczbę cyfr i co najwyżej jedną literę, ale zawsze jest to pewna liczba znaków total (użyjmy przykładu czteroznakowego kodu rezystancji).Lepszy sposób na wyrażenie regularne

Najpierw mógłbym zrobić '\d*[RKM]\d*', ale to pozwoliłoby na coś takiego jak 'R'.

Mogę również zrobić coś takiego, jak '[\dRKM]{4}', ale pozwoli to na takie rzeczy, jak 'RRR4', które nie są wartością, której bym chciał.

'\d{1,4}[Rr]\d{0,3} | ([RKM]\d{3}) | (\d{4})', choć bardziej szczegółowe, nadal pozwalałoby na '1234R567', który nie jest czterema znakami.

Czy w zasadzie istnieje bardziej zwarty sposób pisania '[RKM]\d\d\d | \d[RKM]\d\d | \d\d[RKM]\d | \d\d\d[RKM] | \d\d\d\d'?

+3

Nie jestem pewien, czy będzie lubię to robić, ale może najlepszym sposobem sprawdzenia długości byłoby użycie otaczającego języka programowania. Nasza firma ma listę "typów sprawdzania poprawności" w pliku XML, a także, w każdym przypadku, wyrażenie regularne, pozwala ustawić minimalną/maksymalną długość. (W tym przypadku ustaw tylko na 4) – Katana314

+1

'^ [RKM] \ d {3} | \ d [RKM] \ d {2} | \ d {2} [RKM] \ d | \ d {3} [RKM] | \ d {4} $ 'jest zbyt skomplikowane? Lub, jeśli szukasz w innym tekście: '\ b (?: [RKM] \ d {3} | \ d [RKM] \ d {2} | \ d {2} [RKM] \ d | \ d {3} [RKM] | \ d {4}) \ b " –

Odpowiedz

9

zależności od smaku regex, można użyć uprzedzona:

^(?!(?:\d*\D){2})[\dRKM]{4}$ 
  • (?!(?:\d*\D) - twierdzą, że nie ma dwóch znaków non-cyfrowe.

Lub:

^(?=.{4}$)\d*(?:[RKM]\d*)?$ 
  • (?=.{4}$) - twierdzą, że długość łańcucha wynosi 4.

Patrz także: Regular Expressions: Is there an AND operator?

+0

+1 Przygotowywałem nieco brzydszą wersję używania wyprzedzających:'^(? =. * [RKM]) (? = (. * \ D) {3}) [\ dRKM] {4} $ '(lub nawet'^(? =. * [RKM]) (? = (. * \ D) {3}). {4} $ ') – jensgram

+0

Awesome @Kobi. Dzięki za link. Gdybym mógł, dałbym ci +2. –

+0

@jensgram - Dzięki. Pamiętaj, że litera jest opcjonalna: "1234" również powinno być zgodne. – Kobi