2012-12-17 6 views
5

Jak mogę przedłużyć już obecne Regex za pomocą atrybutu informującego, że regex nie może przekroczyć maksymalnej długości (powiedzmy) 255?Dodawanie "Max Length" do Regex

Mam następujące wyrażenia regularnego:

([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)

ja próbowałem tak, ale nie powiodło się:

{.,255([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)}

+1

Sprawdź długość dopasowanego wyniku? – Cameron

+0

'{., 255}' Po wyrażeniu. –

Odpowiedz

10

Najlepszym sposobem na zrobienie tego, jeśli musi to być wyłącznie rozwiązanie oparte na regex, byłoby użycie obejść.

Zobacz ten przykład: http://regex101.com/r/yM3vL0

Co ja robię tu jest dopasowanie tylko ciągi, które są w większości trzech znaków. To prawda, na mój przykład, nie jest to najlepszy sposób na zrobienie tego. Ale zignoruj ​​to, próbuję pokazać przykład, który zadziała dla ciebie.

Trzeba też zakotwiczyć swój wzór, inaczej silnik będzie po prostu zignorować lookaround (muszę to wyjaśnić dogłębnie?)

Innymi słowy, można użyć następujących w wyrażeniu regularnym, aby ograniczyć to co najwyżej 255 znaków:

^(?!^.{256})([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?) 

ja też czuję, że moim obowiązkiem jest powiedzieć wyrażenie regularne jest zły i powinien czuć się źle.

+0

+1, masz oczywiście całkowitą rację. Całkowicie usunąłem wyrażenie regularne.Ale mimo to twój post pomógł mi lepiej zrozumieć regex :) Dzięki za to! – SeToY

+1

Nie ma problemu! Sprawdź quiz na http://www.regex101.com/quiz/, jeśli chcesz zrozumieć jeszcze lepiej wyrazy regularne :) –

+0

@Lindrian dzięki za link. –

0

regex naprawdę nie jest wykonany, aby rozwiązać wszystkie problemy. W tym przypadku sugerowałbym, że testowanie długości 255 będzie kosztowne, ponieważ będzie wymagało 255 stanów w reprezentacji podstawowej. Zamiast tego po prostu przetestuj długość łańcucha osobno.

Ale jeśli naprawdę musi, to trzeba będzie dokonać znaków opcjonalne, więc coś takiego:

.?{255} 

dopasuje dowolny ciąg znaków 255 lub mniej.

+0

Ale pozwoli każdemu umieścić 255 losowych znaków przed swoim adresem e-mail !!! – jessehouwing

1

Dlaczego po prostu nie sprawdź także maksymalnej długości sznurka? Jeśli używasz DataAnnotations, możesz przykleić [StringLength (255)] do właściwości.

Jeśli używasz sprawdzania poprawności ASP.NET, możesz użyć RangeValidator.

Jeśli używasz niestandardowej funkcji sprawdzania poprawności, znacznie bardziej czytelna (i szybsza) jest sprawdzenie długości przed wyrzuceniem złożonego wyrażenia regularnego względem niej.

0

You "może" być w stanie wykorzystać look-ahead następująco:

^(?=.{0,255}$)your regex here$ 

Więc ...

^(?=^.{0,255}$)([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$