2012-12-17 57 views
5

如何擴展已經存在的正則表達式的一個屬性,告訴正則表達式不能超過最大長度(比方說)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})(\]?)

我已經嘗試過這樣的,但沒有成功

{.,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

檢查匹配結果的長度? – Cameron

+0

'{。,255}'表達式之後。 –

回答

10

要做到這一點,最好的方法是,如果它必須是一個完全基於正則表達式的解決方案,那就是使用lookarounds。

查看這個例子:http://regex101.com/r/yM3vL0

我在做什麼這裏只匹配至多3個字符的字符串。誠然,對我的例子來說,這不是最好的辦法。但忽視這一點,我只是想展示一個適合你的例子。

您也可以以固定的模式,否則發動機會忽略環視(我要在深入解釋一下嗎?)

換句話說,你可以使用正則表達式如下限制它至多255個字符:

^(?!^.{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})(\]?) 

我也覺得這是我的責任,告訴你你的正則表達式不好,你應該感覺不好。

+0

+1,當然你是完全正確的。我已經完全刪除了正則表達式。但是,儘管如此,你的文章幫助我理解正則表達式更好:)感謝! – SeToY

+1

沒問題!如果您想更好地理解正則表達式,請查看http://www.regex101.com/quiz/上的測驗:) –

+0

@Lindrian感謝您的鏈接。 –

0

一個正則表達式是不是真的爲解決所有問題。在這種情況下,我建議測試255的長度將會很昂貴,因爲這將需要255個狀態的底層表示。相反,只需單獨測試字符串的長度。

但如果你真的要,你需要讓你的角色可選,所以像:

.?{255} 

將匹配的255個字符的字符串。

+0

但是會允許任何人在你的電子郵件前放置255個隨機字符! – jessehouwing

1

爲什麼不直接檢查字符串的最大長度?如果您使用DataAnnotations,則可以在該屬性上粘貼[StringLength(255)]。

如果您使用ASP.NET驗證器,則可以使用RangeValidator。

如果您使用的是自定義驗證函數,那麼在您將一個複雜的正則表達式對其進行復雜的正則表達式之前,它的可讀性要高得多(並且速度更快)。

0

你「可能」能夠使用前瞻如下:

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

所以......

^(?=^.{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})(\]?)$