2017-05-17 59 views
-1

我想引用我已經定義了一個稍微複雜的正則表達式看起來像任何文本匹配:JavaScript的正則表達式引用另一個正則表達式(語法錯誤)

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 

我想正則表達式的第二部分是好的,但我可以」弄清楚如何定義第一個而不會產生語法錯誤。

如何在twoRx中參考oneRx

+3

在構造函數符號*中使用*雙轉義。 Besdies,JS不支持向後看。請提供一個預期結果的測試字符串。 –

回答

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]);

重要:
進入您查找的內容match[3](捕獲組3)
你要逃離逃生你可以做什麼用捕捉組,而不是爲當你在javascript中創建正則表達式字符串時,你的字符串中的字符

+0

呃..我遲了7分鐘^^ – Gawil

+0

謝謝,就是我想要的。 –

1

JS正則表達式引擎不支持倒序。另外,您應該使用.sourceRegExp屬性在構造函數表示法中組合正則表達式模式,其中轉義反斜槓必須加倍以表示文字反斜槓。

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);

regex demo

您似乎需要使用.+\s+\d+\s+模式捕獲的值,因此您只需將捕獲括號的那部分模式包裝起來。

請注意,m[3].trim()修剪冗餘空白的值。

+0

感謝您的解釋。這場比賽並不是我想要的,但看到我的編輯與預期的比賽。 –

+0

我剛纔注意到了。您似乎需要使用'。+ \\ s + \\ d + \\ s +'模式捕獲的值,因此您只需將該模式的這一部分用捕獲組包裝即可。下一次,請指出您的字符串和預期匹配是什麼樣的,以避免回答狙擊。 –