我需要能够匹配以下字符串:
GQG6VJ6K
,TYTU-TIDM-56
,4-5-P-Z
等
连字符-
是可选的,但必须至少有一个字母数字字符。
到目前为止,我提出的最佳尝试是[A-Z0-9-]+
错误匹配单个连字符。
我也试过(?[-]*)(?[A-Z0-9]+)
但它不起作用(我是一个正则表达式noob)。奖励积分为何。
解决方案是什么?
修改
^[A-Z0-9]+(-{0,1}[A-Z0-9]+)*$
答案 0 :(得分:2)
这应该可以解决问题:
([A-Z0-9]-?)*[A-Z0-9]
答案 1 :(得分:1)
使用正则表达式
^[A-Z0-9-]*[A-Z0-9][A-Z0-9-]*$
└───┬───┘ └───┬──┘└───┬───┘
│ │ └ alphanumeric characters or hyphens (none or any)
│ │
│ └ one alphanumeric character
│
└ alphanumeric characters or hyphens (none or any)
或
^(?=[A-Z0-9-]*$).*[^-]
└───┬───┘ └─┬┘
│ └ non-hyphen
│
└ allowed characters
答案 2 :(得分:0)
你非常接近!
^(?=.*[A-Z0-9])[A-Z0-9-]+$
|| | |
|| | anchor your regex
|| |
|| what you were already doing
||
|lookahead assertion: at least 1 alphanumeric
|
anchor your regex
修改强>
在考虑如何排除-
在开头或结尾时,我意识到有一个更简单的解决方案:
^[A-Z0-9]+(-[A-Z0-9]+)*$
看起来@AndreKR有这个想法,所以给他+1。
答案 3 :(得分:0)
使用:
/^(?=.*[a-z\d])[a-z\d-]*$/i
i
表示不区分大小写,如果您只想要大写,那么
/^(?=.*[A-Z\d])[A-Z\d-]*$/