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



我对一个看起来很简单的正则表达式有点困惑。

匹配必须是一个只有a-z, a-z, 0-9的字符串,并且必须在字符串的任何地方至少出现一个'-'字符。

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

ABC123-ABC //should match
ABC123ABC //shouldn't match.

应该可以:

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

你明白了:)

Peter的解决方案:(^([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 -

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

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

相关内容

最新更新