繁体   English   中英

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

[英]Regex to match optional character in any order

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

GQG6VJ6KTYTU-TIDM-56 4-5-PZ

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

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

我也尝试过(?[-]*)(?[A-Z0-9]+)但是它不起作用(我是regex noob)。 奖励积分说明原因。

有什么解决方案?

编辑:

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

这应该可以解决问题:

([A-Z0-9]-?)*[A-Z0-9]

使用正则表达式模式

^[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

你很亲密!

^(?=.*[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。

采用:

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

i意思是不区分大小写,如果只需要大写,那么

/^(?=.*[A-Z\d])[A-Z\d-]*$/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM