2012-10-08 14 views
20

Chciałbym wyrażeń regularnych o długości X lub Y:. Na przykład dopasuj ciąg, który ma 8 lub 11 znaków. Obecnie zaimplementowałem to tak: ^([0-9]{8}|[0-9]{11})$.Dopasuj określoną długość x lub y

mogę również realizować ją jako: ^[0-9]{8}([0-9]{3})?$

Moje pytanie brzmi: Czy mogę mieć ten regex nie powielając [0-9] część (co jest bardziej skomplikowany niż ten prosty \d przykład)?

Odpowiedz

31

Jest tylko jedna droga:

^(?=[0-9]*$)(?:.{8}|.{11})$ 

lub alternatywnie, jeśli chcesz zrobić pierwszy czek długości

^(?=(?:.{8}|.{11})$)[0-9]*$ 

W ten sposób masz skomplikowaną część tylko raz i rodzajową . dla kontroli długości.

Objaśnienie:

^  # Start of string 
(?=  # Assert that the following regex can be matched here: 
[0-9]* # any number of digits (and nothing but digits) 
$  # until end of string 
)  # (End of lookahead) 
(?:  # Match either 
.{8} # 8 characters 
|  # or 
.{11} # 11 characters 
)  # (End of alternation) 
$  # End of string 
+0

Bardzo ładne ... Będę musiał dowiedzieć się więcej o tych uprzedzeniach :) – Laoujin

+1

Uwaga: jeśli weźmiesz '^ (? = [0-9] * $) (?:. {8} |. {11}) Wersja $ 'może być błędna dla IE5-8, jak wyjaśniono [tutaj] (http://blog.stevenlevithan.com/archives/regex-lookahead-bug). Przejdź do alternatywnej wersji Tima i działa dla wszystkich przeglądarek. – Laoujin

+0

Uwaga: obie wersje nie są obsługiwane przez schemat XML z powodu grupy, która nie przechwytuje (? :). – user1056903

1

z Perl, można zrobić:

my $re = qr/here_is_your_regex_part/; 
my $full_regex = qr/$re{8}(?:$re{3})?$/ 
+1

Zamknij, ale brakowało} po '$ re {3' – mrk

+0

@mrk: Dobry połów, dziękuję. – Toto

0

Dla tych z nas szuka się uchwycić różne długości z tego samego wielokrotnego spróbować.

^(?:[0-9]{32})+$

Gdzie 32 jest wielokrotnością chcesz uchwycić wszystkie długościach (32, 64, 96, ...).

Powiązane problemy