0

我需要能够匹配以下字符串:

GQG6VJ6K, TYTU-TIDM-56,4-5-P-Z

连字符-是可选的,但必须至少有一个字母数字字符。

到目前为止,我想出的最佳尝试是[A-Z0-9-]+错误地匹配单个连字符。

我也尝试过(?[-]*)(?[A-Z0-9]+),但它不起作用(我是一个正则表达式菜鸟)。为什么加分。

解决方案是什么?

编辑:

@archeong87 引导我找到最终解决方案:^[A-Z0-9]+(-{0,1}[A-Z0-9]+)*$

4

4 回答 4

2

这应该可以解决问题:

([A-Z0-9]-?)*[A-Z0-9]
于 2012-10-15T14:53:43.743 回答
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
于 2012-10-15T15:00:43.527 回答
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。

于 2012-10-15T14:55:45.597 回答
0

采用:

/^(?=.*[a-z\d])[a-z\d-]*$/i

i表示不区分大小写,如果你只想要大写,那么

/^(?=.*[A-Z\d])[A-Z\d-]*$/
于 2012-10-15T14:56:59.263 回答