JavaScript RegExp引用另一个RegExp(语法错误)

时间:2017-05-17 07:27:19

标签: javascript regex

我希望匹配任何引用我已经定义的有点复杂的正则表达式的文本:

var oneRx = /Seite((\S+)\s+\S.*?)(?=\s*\2)/;  

我想要的文字应该紧跟(但不包括)oneRx,并以一个或多个数字结尾,并在这些数字的左侧和右侧有一个或多个空格。

var twoRx = new RegExp('(?<=' + oneRx + ')' + '.+\s+\d{1,}\s+$');   

例如,我想取字符串:

SeiteSGP0136.1 3SE7120 3SE7120-1BF00 SGP0137.1 3SE7140 3SE7140-1CD00 SGP0138.1 3SE7150 3SE7150-1BH00 SGP0136.1 SGP0136.1 One 1 SGP0136.1 Two 3 

并返回

SGP0136.1 SGP0136.1 One 1 SGP0136.1 Two 3

我认为正则表达式的第二部分很好,但我无法弄清楚如何定义第一部分而不会产生语法错误。

我应该如何在oneRx中引用twoRx

2 个答案:

答案 0 :(得分:1)

JS正则表达式引擎不支持lookbehind。此外,您应该使用.source RegExp 属性在构造函数表示法中组合正则表达式模式,其中必须将转义反斜杠加倍以表示文字反斜杠。

&#13;
&#13;
var oneRx = /Seite((\S+)\s+\S.*?)(?=\s*\2)/;
var twoRx = new RegExp(oneRx.source + '(.+\\s+\\d+\\s+)$');
var s = "SeiteSGP0136.1 3SE7120 3SE7120-1BF00 SGP0137.1 3SE7140 3SE7140-1CD00 SGP0138.1 3SE7150 3SE7150-1BH00 SGP0136.1 SGP0136.1 One 1 SGP0136.1 Two 3 ";
var res = (m = s.match(twoRx)) ? m[3].trim() : "";
console.log(res);
&#13;
&#13;
&#13;

请参阅regex demo

您似乎需要使用.+\s+\d+\s+模式捕获的值,因此您只需要使用捕获括号来包裹模式的该部分。

请注意m[3].trim()修剪冗余空格中的值。

答案 1 :(得分:1)

Javascript不支持lookbehinds。您可以做的是改为使用捕获组:

&#13;
&#13;
var oneRx = 'Seite((\\S+)\\s+\\S.*?)(?=\\s*\\2)';  

var twoRx = new RegExp(oneRx + '(.+\\s+\\d+\\s+)$');

var str = 'SeiteSGP0136.1 3SE7120 3SE7120-1BF00 SGP0137.1 3SE7140 3SE7140-1CD00 SGP0138.1 3SE7150 3SE7150-1BH00 SGP0136.1 SGP0136.1 One 1 SGP0136.1 Two 3 ';

var match = str.match(twoRx);
console.log(match[3]);
&#13;
&#13;
&#13;

重要提示:
通过match[3](捕获组3)获取您所需的内容 在javascript中创建正则表达式字符串时,必须在字符串中转义转义字符