0

使用 javascript,.match()我可以简化这个正则表达式吗?我想匹配由连字符分隔的 5x5 或 3x5 块的字母数字代码。

例如我想匹配:

123EF-12B45-123H5-A2CGE-A2345

或者

54321-ABCDE-F2345

到目前为止,我尝试(\w{5}-){4}\w{5}匹配第一个示例并(\w{5}-){2}\w{5}匹配第二个示例。有没有办法匹配或匹配?我尝试将 with 组合,|但它只匹配 3 对。

还是.match()为每个模式运行两次正则表达式更好?

4

4 回答 4

2
(\w{5}-){2}\w{5}|(\w{5}-){4}\w{5}

交替|将首先尝试匹配左边的子表达式,当失败时,它会尝试右边的子表达式。当左侧包含右侧时,它永远不会匹配右侧。在您的情况下,即使有更多组,它也只会停在三个组中。尝试简单地交换它们:

(\w{5}-){4}\w{5}|(\w{5}-){2}\w{5}

您也可以将它们合并为一个:

((\w{5}-){4}|(\w{5}-){2})\w{5}
(\w{5}-){2}((\w{5}-){2})?\w{5}
于 2013-08-15T15:45:54.517 回答
2

你可以使用

^(\w{5}-){2}\w{5}((-\w{5}){2})?$

(\w{5}-){2}\w{5}匹配 3x5 的情况,并且可以选择还有两个块,即 5x5 的情况。

或者你可以使用

^(\w{5}-){2}((\w{5}-){2})?\w{5}$

即把可选块放在中间,或者你的表达式的简单组合:

^((\w{5}-){4}\w{5})|(\w{5}-){2}\w{5})$
于 2013-08-15T15:41:58.663 回答
1

这种方式对我有用:

"123EF-12B45-123H5-A2CGE-A2345".match(/(\w{5}-){4}\w{5}|(\w{5}-){2}\w{5}/)
=> ["123EF-12B45-123H5-A2CGE-A2345", "A2CGE-", undefined]

"123EF-12B45-123H5".match(/(\w{5}-){4}\w{5}|(\w{5}-){2}\w{5}/)
=> ["123EF-12B45-123H5", undefined, "12B45-"]
于 2013-08-15T15:47:27.063 回答
1

您可以尝试为带有连字符的块指定范围:

(\w{5}-){2,4}\w{5}

这(不幸与否)也将匹配 4x5 块,即

54321-ABCDE-F2345-ABF45
于 2013-08-15T15:44:30.043 回答