我希望匹配任何引用我已经定义的有点复杂的正则表达式的文本:
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
?
答案 0 :(得分:1)
JS正则表达式引擎不支持lookbehind。此外,您应该使用.source
RegExp 属性在构造函数表示法中组合正则表达式模式,其中必须将转义反斜杠加倍以表示文字反斜杠。
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;
请参阅regex demo。
您似乎需要使用.+\s+\d+\s+
模式捕获的值,因此您只需要使用捕获括号来包裹模式的该部分。
请注意m[3].trim()
修剪冗余空格中的值。
答案 1 :(得分:1)
Javascript不支持lookbehinds。您可以做的是改为使用捕获组:
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;
重要提示:
通过match[3]
(捕获组3)获取您所需的内容
在javascript中创建正则表达式字符串时,必须在字符串中转义转义字符。