2013-05-23 16 views
6

Przeczytałem pytania dotyczące wyrażeń regularnych na tej stronie, ale mój problem wydaje się być nieco inny. Muszę dopasować 2-cyfrowy numer, na przykład 23 do 75. Robię to w systemie Unix HP-UX. Znalazłem przykłady 3 - 44, ale też dowolną cyfrę, nic, co jest ustalone w długości, co jest nieco zaskakujące, ale być może nie rozumiem przykładowej odpowiedzi o zmiennej długości.Wyrażenie regularne - zakres dwóch cyfr (23-79)?

+6

Czy na pewno chcesz skorzystać z wyrażenia regularnego? Wygląda na to, że bardziej odpowiednie może być przekształcenie na typ całkowy, a następnie porównanie liczb całkowitych. Zwłaszcza jeśli zasięg może się zmienić w przyszłości. – Paulpro

+2

Pozwolę sobie po raz drugi @ Paulpro zalecenie - podczas gdy regex * może * to zrobić, to jest słabe (mam ochotę powiedzieć "straszne") narzędzie do pracy. –

+0

Co jest nie tak z '23 <= the_number <= 75'? –

Odpowiedz

7

Ponieważ nie wskazujesz, czy jest to dodatek do innych znaków (lub w środku większego ciągu znaków), dodałem tutaj logikę, aby wskazać, co jest potrzebne do dopasowania liczby części strunowy. To powinno cię tam zabrać. Tworzymy zakres dla drugich liczb, których szukamy, dopuszczając tylko te postacie. Wtedy jesteśmy porównując ją do innych zakresów jako or:

(2[3456789]|[3456][0-9]|7[]) 

Jak Oded zauważyć można to zrobić również od podkolejki zakresy są również akceptowane (w zależności od wykonania regex w aplikacji używasz):

(2[3-9]|[3-6][0-9]|7[0-5]) 

podstawie tytułu byś zmienił w ostatnich 5 do 9, aby przejść od 75-79:

(2[3-9]|[3-6][0-9]|7[0-9]) 

Jeśli próbujesz dopasować te numery specjalnie jako st ring (od początku do końca), wtedy użylibyście modyfikatorów ^ i $, aby wskazać początek i koniec ciągu.

Jest doskonały odniesienia techniczny Regex waha się tutaj:

http://www.regular-expressions.info/numericranges.html

Jeśli używasz coś jak grep i stara się dopasować wiersze zawierające numer z innej treści, to możesz zrobić coś takiego to dla zakresów thru 79:

grep "[^0-9]?(2[3-9]|[3-6][0-9]|7[0-9])[^0-9]?" folder 
+3

Można skrócić do '(2 [3-9] | [3-6] [0-9] | 7 [0-5])' – Oded

+0

Dobrze. Wpadłem na przypadki, w których to nie działa w każdej implementacji, ale zgodnie ze standardem powinno. –

+1

to się zwróci, jeśli przejdziesz 2345 – SolidSnake

0

masz dwie klasy liczb chcesz dopasować:

  • cyfrą 2, a następnie jedną z liczb od 3 do 9
  • jedną z liczb od 3 do 7, a następnie przez każdą cyfrę

Edycja: No, to zakres Tytułowa (23-79).W swoim pytaniu (23-75), masz trzy:

  • cyfra 2, a następnie przez jedną z cyfr między 3 a 9
  • jednej z cyfr od 3 do 6, a następnie dowolną cyfrę
  • cyfra 7, a następnie jedną z cyfr od 0 do 5
+0

Prawie - do "75", a nie "79". – Oded

+0

@Oded The op napisał 79 w temacie, a następnie 75 w treści postu. Nie jest jasne, czego naprawdę chce. – Paulpro

+0

Przeprosiny za literówkę w tytule przykładu, dwie liczby były przykładami, kluczowym punktem były tylko 2 cyfry. Ale rozumiem, co masz na myśli, 79 pasuje do całego zakresu [3-7] [0-9], 75 było dokładniejsze, ponieważ nie zawsze mogłem wypełnić cały zakres. Tak więc szukam odpowiedzi na 3 części. – user2414817

3

narzędzie to jest dokładnie to, czego potrzebujesz: Regex_For_Range

Od 29 do 79: \b(2[3-9]|[3-7][0-9])\b

Od 29 do 75: \b(29|[3-6][0-9]|7[0-5])\b

I tak dla zabawy, od 192 do 1742: \b(19[2-9]|[2-9][0-9]{2}|1[0-6][0-9]{2}|17[0-3][0-9]|174[0-2])\b :)

+0

Narzędzie ma teraz podpowiedź poświadczeń, czy znasz właścicieli? – weston

+0

@weston Too bad! Skontaktuję się z nimi, aby poznać przyczynę tego uwierzytelnienia i wrócę do Ciebie. – sp00m

+0

Cóż, jeśli je znasz, może uda ci się przekonać ich do otwarcia źródła. Opublikuj na githubie, lub tutaj – weston

-1

ten powinien zrobić:

/^([2][3-9]|[3-6][0-9]|[7][0-5])$/ 

^ i $ będzie to ścisłe że dopasuje tylko 2 numery, więc w przypadku, gdy masz i.e 234, to nie zadziała.

+1

A więc przegłosowałeś i skopiowałeś moją odpowiedź? Nie fajnie. –

+1

Dodatkowo to nie zadziała, jeśli używają czegoś podobnego do 'grep', aby dopasować wiersz zawierający szukane liczby. –

+1

@ AbsoluteƵERØ - nie mój przyjaciel, którego nie głosowałem, głosuję na twoją odpowiedź. Zajęło mi to ponad 5 minut, aby przetestować wymagania, a następnie wysłałem go, a następnie JUST sprawdził swoją odpowiedź. – SolidSnake

1

Jeśli chce 2 cyfra zakres 0-63

/^[0-9]|[0-5][0-9]|6[0-3]$/ 
  1. [0-9] pozwoli jednej cyfry od 0 do 9
  2. [0-5], [0-9] Czy pozwalają od 00 do 59
  3. 6 [0-3] pozwoli od 60 do 63

ten sposób można wziąć wyrażenie regularne dla każdej dwie cyfry Zakres