我正在尝试编写一个正则表达式,如果它与下面的格式匹配,它将返回
true
,否则,它应该返回 false
。它应该只允许以下单词:
正匹配(返回true)
UA-1234-1,UA-12345-2,UA-34578-2
负匹配(返回 false 或 null)
注意:
A
之后缺少
U
UA-1234-1,U-12345-2
当传递给正则表达式的字符串是时,它应该总是给我 true
UA-1234-1,UA-12345-2,UA-34578-2,...........
下面是我想要做的,但它只匹配第一个元素并且不返回 null。
var pattern=/^UA-[0-9]+(-[0-9]+)?/g;
pattern.match("UA-1234-1,UA-12345-2,UA-34578-2");
pattern.exec("UA-1234-1,UA-12345-2,UA-34578-2)
提前致谢。非常感谢您的帮助。
您需要的模式是用锚点(
^
- 字符串开头和$
- 字符串结尾)包围的模式,它首先与您的模式(初始“块”)匹配,然后匹配 0 次或多次出现,
接下来是块图案。
看起来像
/^BLOCK(?:,BLOCK)*$/
。您可以在两者之间引入可选的空格,例如/^BLOCK(?:,\s*BLOCK)*$/
。
^UA-[0-9]+(?:-[0-9]+)?(?:,UA-[0-9]+(?:-[0-9]+)?)*$
。最好动态构建它以保持可读性和易于维护:
const block = "UA-[0-9]+(?:-[0-9]+)?";
let rx = new RegExp(`^${block}(?:,${block})*$`); // RegExp("^" + block + "(?:," + block + ")*$") // for non-ES6
let tests = ['UA-1234-1,UA-12345-2,UA-34578-2', 'UA-1234-1,U-12345-2'];
for (var s of tests) {
console.log(s, "=>", rx.test(s));
}
用逗号分割字符串,然后测试每个元素。