2013-08-12 66 views
3

我現在寫了一個簡單的格式化函數來替換字符串中的某些佔位符。修改格式化模式以替換字符串中的佔位符

var format = function (a, c) { 
    return a.replace(/{ *([^} ]+) *}/g, function (b, a) { 
     b = c; 
     a.replace(/[^.|\[\]]+/g, function (a) { 
      b = b[a]; 
     }); 
     return b; 
    }); 
}; 

語法目前使用大括號符號{key},我現在嘗試修改RegExp -pattern以百分之一,而不是%key工作。

var pattern = /{ *([^} ]+) *}/g; 

我想只是一個百分比%更換括號{},但是這仍然不能正常工作。

var pattern = /% *([^% ]+) */g; 

模式預計下列條件工作

var data = { 
    obj: { 
     foo: 'Foo', 
     bar: 'Bar' 
    }, 
    arr: ['Foo', 'Bar'] 
}; 

var objTest = '{obj.foo}, is not equal to {obj.bar}.' 
format(objTest, data) // => 'Foo, is not equal to Bar.' 

var arrTest = '{arr[0]}, is not equal to {arr[1]}.' 
format(arrTest, data) // => 'Foo, is not equal to Bar.' 

如果我們用我修改的圖案,似乎每一個佔位符,替換後的最後一個字符會刪除:

'%obj.foo, is not equal to %obj.bar.' // => 'undefined is not equal to Bar' 
'%arr[0], is not equal to %arr[1]' // => 'undefined is not equal to Bar' 

任何想法如何修改pattern以使其可以使用百分比%而不是花括號{}

+1

您是否需要使用%?如何處理%是弦的合法部分,例如'%obj.foo%不是%obj.bar%'的10%? –

+0

顯然,'''應該結束一個標識符。然後你可以用'[^%,]'替換'[^%]'。但是這意味着你的替換不能和'obj [「a,b」]'一起工作。你會發現,你需要實際解析JavaScript標識符(以及所有可能的嵌套),以使其正常工作。 –

+0

此庫可以用作參考,也可以直接使用。 https://github.com/tarangkhandelwal/substitutor.js – Tarang

回答

0

您可以使用此模式:

var regex = /%([^\b]+)/g; 

這意味着%符號後面跟一個完整的詞。這不包括空格字符,下劃線等

如果改爲希望能夠使用這些字符,以及,你可以這樣寫:

var regex = /%(\S+)/g; 

這是等價的:

var regex = /%([^\s]+)/g; 
+0

是啊,看起來不錯!但是,仍然存在一個問題。如果佔位符後面跟着一個逗號,它似乎不工作'%arr [0],// => undefined' – yckart

0

原因是你修改後的正則表達式模式不知道何時停止匹配。在前一箇中,它終止於以下}符號。

這不是一件容易的事情,因爲可以看到結束格式的各種可能性,這裏您在每個替換字符串的末尾都有一段標點符號,即句號%arr[1].或逗號%obj.foo,

因此,爲了使你的情況的玩具這項工作可以在原有的格局與[\.,]

/% *([^% ]+) *[\.,]/g 

更換}這是可行的,但現在你的置換方式需要始終與任何一個句號或終止逗號,我懷疑是不是你想要的。最好終止一個知道的字符,例如%,這將使您的匹配模式/% *([^% ]+) *%/g和您的格式%obj.foo%,您可以通過加倍輸出%%obj.bar%%%