2012-07-08 75 views
2

我想寫一個類名開始,一直點類名之間以及與類名 每個類名結束,開始以letter.it就像Java類的進口正則表達式模式,什麼是更好的方式來編寫一個模式來驗證這個字符串?

我寫這個模式,但它太複雜和緩慢的驗證,我認爲它不能正常工作

^([a-zA-Z]([0-9]|_|[a-zA-Z])*)(([a-zA-Z]([0-9]|_|[a-zA-Z])*)|\\.)*([a-zA-Z]([0-9]|_|[a-zA-Z])*)$ 

例如我的輸入字符串應該是這樣的:「com.casp.common.StringUtils」

回答

2

首先,簡化:

[0-9]|_|[a-zA-Z] 

可以組合爲

[0-9_a-zA-Z] 

,實際上它有一個速記代表

\w 

讓你的正則表達式可以先簡化這個等價形式:

^([a-zA-Z](\w)*)(([a-zA-Z](\w)*)|\.)*([a-zA-Z](\w)*)$ 

現在,我們可以進一步通過去除一些多餘的捕捉組簡化,並打開不區分大小寫匹配

^[a-z]\w*([a-z]\w*|\.)*[a-z]\w*$ 

當然,這個正則表達式是不正確的,例如匹配a....b

問題是因爲\.是一個「替代」,它不應該是,因爲每個組件之間的點需要需要。因此,它可能應該轉化爲:

^[a-z]\w*([a-z]\w*\.)*[a-z]\w*$ 

但它仍然是不正確,因爲它不會匹配a.b,因爲前沿部分。我們需要將其刪除:

^([a-z]\w*\.)*[a-z]\w*$ 

,並可能重新安排它使得重複的部分是在年底,而不是開始:

^[a-z]\w*(\.[a-z]\w*)*$ 
+1

感謝Kenny,([a-zA-Z](\ w)*)(([a-zA-Z](\ w)*)| \。)*([a-zA-Z](\ w )*)$ 它匹配ab,並且不匹配ab – Pooya 2012-07-08 08:12:18

2

什麼是錯的只是以下內容:

^([a-zA-Z][a-zA-Z0-9_]*\.?)+$ 

只要有一個,它就會將類名與任意數量的包匹配。如果你需要至少兩個實例下面將正常工作,以及:

^([a-zA-Z]+)\.([a-zA-Z][a-zA-Z0-9_]*\.?){1,}$ 
+0

謝謝您的回答,但它的com.casp匹配。 common.StringUtils。 它以點號結尾 – Pooya 2012-07-08 08:04:01

+0

啊,它的確如此,並且提示爲時已晚。 – sean 2012-07-08 08:13:16

相關問題