我想测试一个字符串是8位还是相同的数字可以分成由-
分隔的4个部分。
我有一个正常的正则表达式:
/^\d{2}([-]?)(\d{2})\1\d{2}\1\d{2}$/
我可以证明:
/^\d{2}([-]?)(\d{2})\1\d{2}\1\d{2}$/.test('12345678'); // true
/^\d{2}([-]?)(\d{2})\1\d{2}\1\d{2}$/.test('12-34-56-78'); // true
/^\d{2}([-]?)(\d{2})\1\d{2}\1\d{2}$/.test('12-45-7810'); // false
/^\d{2}([-]?)(\d{2})\1\d{2}\1\d{2}$/.text('-12-45-78-10'); //false
我本来希望从\d{2}
创建一个群组,但我尝试了这个:
/^(\d{2})([-]?)\1\2\1\2\1$/
但它与任何东西都不匹配。
答案 0 :(得分:1)
你可以写得更短:^\d\d(-\d\d){3}$|^\d{8}$
答案 1 :(得分:0)
你试过了吗?
const r = new RegExp(/^-?\d{2}-?\d{2}-?\d{2}-?\d{2}$/);
console.log(r.test("12345678")); // true
console.log(r.test("12-34-56-78")); // true
console.log(r.test("12-45-7810")); // true
console.log(r.test("-12-45-78-10")); // true
这适用于我。
答案 2 :(得分:0)
您无法使backrefernces(对使用组模式捕获的实际值的引用)工作为subroutines(构造“重复”某些组模式,而不是实际捕获的值)。
您只能定义模式部分并使用它们来构建更长的模式:
const n = "\\d{2}";
const h = "-?";
const rx = new RegExp(`^${n}(?:${h}${n}){3}$`);
console.log(rx.source); // ^\d{2}(?:-?\d{2}){3}$
// ES5:
// var rx = new RegExp("^" + n + "(?:" + h + n+ "){3}$");
const strs = ['12345678', '12-34-56-78', '12-45-7810', '-12-45-78-10'];
for (let s of strs) {
console.log(s, "=>", rx.test(s));
}