JavaScript RegEx-首先匹配一个表达式,然后再匹配另一个表达式

时间:2018-09-19 19:02:05

标签: javascript regex match

我正在尝试使用JavaScript正则表达式检查字符串中是否有与某个字母集(后跟5或6个数字)匹配的任何内容。例如,如果字符串是'MyValue12345 blah blah MyValue123456 blah MyValue222221',则它应返回匹配项['MyValue12345', 'MyValue123456', 'MyValue222221']。我是RegEx新手(很明显),我的表情接近了,但不完全是我想要的...

这是我的第一次尝试:

var str = 'MyValue12345 blah blah MyValue123456 blah MyValue222221';
var matchArr = str.match(/MyValue\d\d\d\d\d|MyValue\d\d\d\d\d\d/gi);

matchArr然后等于['MyValue12345', 'MyValue123456', 'MyValue22222'],但是MyValue22222的最后一个值不是我想要的,我想说{{1}的完整表达}。我知道有更好的方法可以做到这一点,但我正在努力做到……有什么想法吗?

2 个答案:

答案 0 :(得分:1)

使用quantifier range {n,m}regex101):

var str = 'MyValue12345 blah blah MyValue123456 blah MyValue222221';
var matchArr = str.match(/MyValue\d{5,6}/gi);

console.log(matchArr);

答案 1 :(得分:1)

正则表达式尝试应用您的| alternative的第一个模式,当匹配时即为结果。仅当不匹配时,它才会尝试第二种选择。因此,您可以将两者互换以使其工作:

/MyValue\d\d\d\d\d\d|MyValue\d\d\d\d\d/gi

但是,这是非常重复的-最好在差异之间使用group

/MyValue\d\d\d\d\d(?:\d|)/gi
//                ^^^^^^^ one digit or none

您可以使用? modifier来语法上将其缩短,该匹配项将匹配“一个或没有”:

/MyValue\d\d\d\d\d\d?/gi
//                ^^^ one digit or none

最后但并非最不重要的一点是,您将要看看repetition syntax

/MyValue\d{5}\d?/gi
//      ^^^^^ five digits
/MyValue\d{5,6}/gi
//      ^^^^^ five or six digits