2017-06-16 48 views
1

我有這樣的信息:表達常規 - 反向引用

  • 目標= 16-10-2017
  • 模式= /([0123][0-9])-(\1)-(\d{4})/g

我的問題。爲什麼「後退參考」不起作用?我想了解語法的功能以及我犯了什麼錯誤。因爲在我的理解中,第一組([0123][0-9])應該考慮數字「10」和「16」,或者不是?爲什麼?

Regex Example Online

+1

反向引用的工作原理類似於* *本身之前匹配的字符串*的複製/粘貼。 – revo

+1

'(\ 1)'打算做什麼?它不應該是'(\ d {2})'嗎? – Arg0n

回答

3

匹配的兩個部分[0123][a-9]numbers隨後兩個部分反向引用只與使用相應的c捕獲的文本匹配確定組。它不重複該模式,而是已經獲取的值。

在您的情況下,\1嘗試匹配16之後的第一個-

在JS的正則表達式,則不能使用可以在PCRE/Onigmo使用(?1)/\g<1>子程序調用,但用戶還可以定義子模式作爲變量和動態生成圖案:

var target = "16-10-2017"; 
 
var p1 = "[0123][0-9]"; 
 
var rx = new RegExp("(" + p1 + ")-(" + p1 + ")-(\\d{4})", "g"); 
 
console.log(target.replace(rx, "$1/$2/$3"));

+0

我很欣賞所有評論。 @WiktorStribiżew您的意見正是我所需要的。理論是目標。謝謝 – DNick

2

也許你有你的正則表達式改變這個(([0123][0-9])-){2}(\d{4}),這意味着它應該由-(([0123][0-9])-){2}

regex demo

+1

這種方法有兩個瓶頸:1)如果OP需要捕獲兩個組(並且似乎OP需要,因爲兩者都被捕獲),2)在其他情況下,當模式不能以這種方式重複時(即,當它們毗鄰)。如果目的是提取/刪除子字符串,那麼它是當前場景的完美解決方案。 –

+0

謝謝@WiktorStribiżew爲您的信息,我感謝它 –

+1

@YCF_L。謝謝你分享你的知識。 – DNick