2011-07-19 26 views
9

我有點困惑與看似簡單的特定正則表達式。簡單的正則表達式,匹配任何字符串至少有一個連字符

匹配項必須是僅帶a-z,A-Z,0-9的字符串,並且必須在字符串中的任意位置至少出現一個' - '字符。

我有[a-zA-Z0-9-]+但問題是,它也會匹配那些沒有' - '字符。

ABC123-ABC //should match 

ABC123ABC //shouldn't match. 

回答

19

這應該工作:

^([a-zA-Z0-9]*-[a-zA-Z0-9]*)+$ 

此外,如果你想有確切135連字符:

^([a-zA-Z0-9]*-[a-zA-Z0-9]*){135}$ 

,或者如果你想有至少23個連字符,但不超過54連字符:

^([a-zA-Z0-9]*-[a-zA-Z0-9]*){23,54}$ 

你得到:)

+0

謝謝,做事情如果你需要n個連字符,你真的會囉嗦嗎? – maxp

+1

只是FYI:這篇文章中提供的第一個正則表達式('^ [a-zA-Z0-9] * - [a-zA-Z0-9] * $')與_exactly_連字符匹配,所以如果您想要_at least_ one連字符(如原文中所述),你應該像其他例子一樣包裝它,並添加** + **:'^([a-zA-Z0-9] * - [a-zA-Z0-9] * )+ $' –

+0

這甚至會匹配只有一個字符串的字符串,如果它總是需要在alphanums之間進行包裝,那麼我們可以使用([a-zA-Z0-9] + - [a-zA-Z0 -9] +)我試過了,但它不正確匹配。是否匹配的字符串部分不會被第二次考慮?對不起,我是新的正則表達式和困惑。 –

2

這裏有一個簡單的正則表達式的一點:

^(?=.*-)[a-zA-Z0-9-]+$ 
2

彼得的解決方案:給定一個匹配字符串時(^([a-zA-Z0-9]*-[a-zA-Z0-9]*)+$)表現良好。

aa-aa-aa-aa-aa-aa-aa-aa-aa-aa-aa-aa%

這裏是正則表達式,其避免這個問題::

^[a-zA-Z0-9]*-[-a-zA-Z0-9]*$ # Match one or more -

^([a-zA-Z0-9]*-){5}[a-zA-Z0-9]*$ # Match exactly 5 -

^([a-zA-Z0-9]*-){1,5}[a-zA-Z0-9]*$ # Match from 1 to 5 -然而,當與非匹配的字符串,如呈現這個表達式經歷Catastrophic Backtracking

相關問題