简单正则表达式,匹配任何字符串与至少一个连字符

时间:2011-07-19 08:55:39

标签: regex

我对一个看似简单的特殊正则表达式感到有些困惑。

匹配必须是只包含a-z,A-Z,0-9的字符串,并且必须在字符串中的任何位置至少出现一个“ - ”字符。

我有[a-zA-Z0-9-]+但问题是,它也会匹配那些没有' - '字符的人。

ABC123-ABC //should match

ABC123ABC //shouldn't match.

3 个答案:

答案 0 :(得分:24)

这应该有效:

^([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}$

你明白了这一点:)

答案 1 :(得分:4)

彼得的解决方案:( ^([a-zA-Z0-9]*-[a-zA-Z0-9]*)+$)在给定匹配的字符串时表现良好。但是,当使用不匹配的字符串(例如:

)时,此表达式会遇到Catastrophic Backtracking

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 -

答案 2 :(得分:2)

这是一个简单的正则表达式:

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