2016-09-14 75 views
0

我解決了字符串中標記替換的問題,例如: 「Hello,#name!」應評價爲:「你好,約翰!」 我測試了基於regexp的算法,它工作正常。問題是,當我嘗試添加標籤動態搜索它不知何故解析。 所有代碼:正則表達式不解析

var replaceTags = function(str, tags) { 
     var tagPattern = { search: "(^|[^#])((##)*)#", copy: "$1$2" }; 
     var result; 
     var tagNames = Object.keys(tags); 
     for(var i = 0; i < tagNames.length; i++) { 
      var subDollarEscaped = tags[tagNames[i]].replace(RegExp("\\$", "g"), "$$$$"); 
      result = str.replace(RegExp(tagPattern.search + tagNames[i], "g"), tagPattern.copy + subDollarEscaped); 
     } 
     result = result.replace(RegExp("##", "g"), "#"); 

     return result; 
    }; 

的問題是在這條線:

result = str.replace(RegExp(tagPattern.search + tagNames[i], "g"), tagPattern.copy + subDollarEscaped); 

不知怎的,字符串是不正確連接在一起。例如,將此行更改爲:

result = str.replace(RegExp(tagPattern.search + "name", "g"), tagPattern.copy + subDollarEscaped); 

根據doc Object.keys()應該返回字符串數組,但它看起來好像沒有。我做了控制檯輸出,以確保爲標籤「名」

tagPattern.search + tagNames[i] 

真正的計算結果爲

(^|[^#])((##)*)#name 

所以我真的很困惑。

+0

tagNames [i]到字符串的不同會話也不起作用。 –

+0

你的函數永遠不會使用'str',並且'result'永遠不會被設置爲除自身替換之外的值。第三行是否應該讀取'var result = str;'或其他內容? – ClasG

+0

噢,對不起,在我的真實版本中它使用str的原因,我已經改變了示例 –

回答

2

這是一段基於您的代碼的代碼片段,它似乎可行。

var str = 'Hello there #name, occupant of room #room!', 
 
    tags = { 
 
     name:'Fomin', 
 
     room:'123' 
 
    }, 
 
    tagPattern = { search: "(^|[^#])((##)*)#", copy: "$1$2" }, 
 
    result=str, 
 
    tagNames = Object.keys(tags), 
 
    subDollarEscaped ; 
 

 
for(var i = 0; i < tagNames.length; i++) { 
 
    subDollarEscaped = tags[tagNames[i]].replace(RegExp("\\$", "g"), "$$$$"); 
 
    result = result.replace(RegExp(tagPattern.search + tagNames[i], "g"), tagPattern.copy + subDollarEscaped); 
 
} 
 

 
result = result.replace(RegExp("##", "g"), "#"); 
 
console.log('result:'+result);

差異是我分配strresult與開始,然後用的替換結果賦給result

+0

哦,我發現了這個問題。我真的把結果分配給每個週期滴答的評估。抱歉。 –

+0

你有沒有讀過代碼後的評論? **「不同的是,我將str分配給結果,然後將結果賦給替換結果。」** – ClasG