在JS正则表达式中重用捕获组模式

时间:2018-05-27 13:18:20

标签: javascript regex

我想测试一个字符串是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$/

但它与任何东西都不匹配。

3 个答案:

答案 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));
}