正则表达式以任何顺序匹配可选字符

时间:2012-10-15 14:48:41

标签: c# regex

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

GQG6VJ6KTYTU-TIDM-564-5-P-Z

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

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

我也试过(?[-]*)(?[A-Z0-9]+)但它不起作用(我是一个正则表达式noob)。奖励积分为何。

解决方案是什么?

修改

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

4 个答案:

答案 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-]*$/