Javascript 正则表达式以获取完整的可选部分(如果存在)

Javascript 正则表达式以获取完整的可选部分(如果存在),javascript,regex,Javascript,Regex,我需要验证输入的订单号是原件还是副本 订单号可以有数字或字符,并且必须是13([A-Z0-9]{13}) 一个副本,用破折号隔开,并加上一个大写字母([-]{1}[A-Z]{1}) 鉴于用户可以输入原始订单或副本订单,副本可以存在,也可以不存在,因此,到目前为止,我有这个 ([a-zA-Z0-9]{13})([-]{1}[A-Z]{1}){0,1} 它工作正常,但我有一个问题,验证当输入副本时,它是否已完成且正确 /([a-zA-Z0-9]{13})([-]{1}[A-Z]{1}){0,1}/

我需要验证输入的订单号是原件还是副本

订单号可以有数字或字符,并且必须是13
([A-Z0-9]{13})

一个副本,用破折号隔开,并加上一个大写字母
([-]{1}[A-Z]{1})

鉴于用户可以输入原始订单或副本订单,副本可以存在,也可以不存在,因此,到目前为止,我有这个

([a-zA-Z0-9]{13})([-]{1}[A-Z]{1}){0,1}
它工作正常,但我有一个问题,验证当输入副本时,它是否已完成且正确

/([a-zA-Z0-9]{13})([-]{1}[A-Z]{1}){0,1}/.test("ABCDEFGKLM123") // true
/([a-zA-Z0-9]{13})([-]{1}[A-Z]{1}){0,1}/.test("ABCDEFGKLM123-A") // true
/([a-zA-Z0-9]{13})([-]{1}[A-Z]{1}){0,1}/.test("ABCDEFGKLM123-AA") // true. Should return false!
/([a-zA-Z0-9]{13})([-]{1}[A-Z]{1}){0,1}/.test("ABCDEFGKLM123-") // true. Should return false!
/([a-zA-Z0-9]{13})([-]{1}[A-Z]{1}){0,1}/.test("ABCDEFGKLM123A") // true. Should return false!
我在正确验证最后3个场景时遇到问题

/([a-zA-Z0-9]{13})([-]{1}[A-Z]{1}){0,1}/.test("ABCDEFGKLM123") // true
/([a-zA-Z0-9]{13})([-]{1}[A-Z]{1}){0,1}/.test("ABCDEFGKLM123-A") // true
/([a-zA-Z0-9]{13})([-]{1}[A-Z]{1}){0,1}/.test("ABCDEFGKLM123-AA") // true. Should return false!
/([a-zA-Z0-9]{13})([-]{1}[A-Z]{1}){0,1}/.test("ABCDEFGKLM123-") // true. Should return false!
/([a-zA-Z0-9]{13})([-]{1}[A-Z]{1}){0,1}/.test("ABCDEFGKLM123A") // true. Should return false!

我仍在试图找出如何做到这一点,如果可选部分存在,那么它在这里是完整和正确的

这里有一些问题。首先,你不需要
{0,1}
对于可选情况,你可以简单地使用
[-]{1}
可以
-
[A-Z]{1}
[A-Z]
。此外,您还需要使用开始和结束锚来从开始到结束匹配字符串,以避免匹配某些字符串,如
ABCDEFGKLM123-AA

^([a-zA-Z0-9]{13})(-[A-Z])?$

参见演示

这里有一些问题。首先,您不需要
{0,1}
作为可选案例,您可以简单地使用
[-]{1}
可以是
-
[A-Z]{1}
[A-Z]
。此外,您还需要使用开始和结束锚来从开始到结束匹配字符串,以避免匹配某些字符串,如
ABCDEFGKLM123-AA

^([a-zA-Z0-9]{13})(-[A-Z])?$
请参见演示

尝试此正则表达式

(^[a-zA-Z0-9]{13}(?:[-]{1}[A-Z]{1}){0,1}$)
试试这个正则表达式

(^[a-zA-Z0-9]{13}(?:[-]{1}[A-Z]{1}){0,1}$)

@m、 塞基拉欢迎;)令人惊叹的!谢谢,工作完美,如此简单,看起来我错过了游戏的开始和结束@m、 塞基拉欢迎;)令人惊叹的!谢谢,工作完美,如此简单,看起来我错过了游戏的开始和结束!太棒了,这一个工作得很好,就像卡斯拉姆夫的一样。很遗憾,我不能把这两个都作为我问题的正确答案,谢谢!!太棒了,这一个工作得很好,就像卡斯拉姆夫的一样。很遗憾,我不能把这两个都作为我问题的正确答案,谢谢!!