如果匹配下面的格式,我试图编写一个将返回true
的正则表达式,否则,它应该返回false
。它应该只允许如下的单词:
肯定匹配(返回true)
UA-1234-1,UA-12345-2,UA-34578-2
否定匹配(返回false或null)
注意:A
U
UA-1234-1,U-12345-2
当字符串传递给正则表达式时,它应该总是给我
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 :(得分:0)
你需要的模式是一个用锚点(^
- 字符串的开头和$
- 字符串的结尾)包含的模式,它首先匹配你的模式(最初的“块”)然后匹配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));
}
答案 1 :(得分:-2)
用逗号分隔字符串,然后测试每个元素。