2016-07-20 106 views
-1

在node.js服務中,我希望在字符串內執行替換,其中結果字符串依賴於原始字符串內的數字值。我必須使用string.prototype.replace,我必須在一個步驟中完成這些工作,這些都是給定的條件,所以請不要問爲什麼。有條件的JavaScript正則表達式

var original = "blah/XX/blah"; //XX stands for 00-99 
var regexp = new RegExp(/blah\/(d{2})\/blah/, "g"); 
var alternate = "mama$1/mia"; 
var result = original.replace(regexp, alternate); 

預期結果:

XX == 01 => mama/mia 
XX > 01 => mamaXX/mia 

如何做到這一點?

+0

不管你想要返回的字符串(XX)/ mia替換初始字符串嗎? – eltonkamami

+0

BTW:在這種情況下,您不需要使用RegExp構造函數,因爲傳遞給構造函數的字符串是靜態的,而不是動態的。 – hindmost

+0

使用字符串匹配方法,然後使用if語句根據該if語句的結果執行不同的替換。 – evolutionxbox

回答

1

您可以使用非捕獲組和交替做到這一點:var regexp = new RegExp(/blah\/(?:(01)|\d{2})\/blah/, "g");

說明:

  • (?:...)是一個非捕獲組,因此它不會影響$1
  • (?:(...)|...)是一個非捕獲組,有兩種選擇。第一種方法保存爲$1。第二個不分組。
  • 01|\d{2}是一種替代方案。 01會匹配兩者,但正則表達式引擎會在第一場比賽中停止。

你可以玩this fiddle

+1

好主意,雖然你的回答給了我與我所需要的相反的東西。使用你的想法,這解決了這個問題: 'var regexp = new RegExp(/ blah \ /(?:(01)|(\ d {2}))\/blah /,「g」);' 'var alternate =「mama $ 2/mia」;' – Dondey

+1

您不需要捕捉'(01)',你可以使用'var regexp = new RegExp(/ blah \ /(?: 01 |(\ d {2}))\/blah /,「g」); var alternate =「mama $ 1/mia」;' –

1

您可以利用內部replace回調方法來分析整數,並指定取決於值不同的替代品:

var original = "blah/01/blah"; //XX stands for 00-99 
 
var regexp = /blah\/(\d{2})\/blah/g; 
 
var result = original.replace(regexp, function($0, $1) { 
 
    return $1 !== "01" ? "mama" + $1 + "/mia" : "mama/mia"; 
 
}); 
 
console.log(result);

隨着/blah\/(\d{2})\/blah/g我們符合所有子開始blah/,則有2位數和/blah,然後檢查數量是否大於1,我們連接"mama",編號和"/mia"。如果是10,我們只返回"mama/mia"

只是供參考:你在正則表達式中有一個錯字,\d匹配一個數字,而不僅僅是d

+0

是真的,我錯過了在數字匹配器前輸入反斜槓 – Dondey

+0

我現在看到你的意思了。我更新了答案,現在它同樣解決了您的問題。在'replace'中使用回調方法是一種靈活的解決方案,但您可能不需要這種靈活性。無論如何,它比在非交替式捕獲組內捕獲更具可讀性。 –