我有示例字符串:
[:pl]Field_value_in_PL[:en]Field_value_in_EN[:]
我希望得到类似的东西:
Object {
pl: "Field_value_in_PL",
en: "Field_value_in_EN"
}
但我不能假设输入字符串中总会有“[:pl]”和“[:en]”。只能:pl或:en,:de和:fr或任何其他组合。
我试图为此写Regexp,但我失败了。
答案 0 :(得分:2)
尝试使用.match()
与RegExp
/:(\w{2})/g
匹配:
后跟两个字母数字字符.map()
来迭代.match()
返回的结果, String.prototype.slice()
要从结果:
移除.split()
,RegExp
/\[:\w{2}\]|\[:\]|:\w{2}/
[
删除]
,:
字符并匹配{{1}接下来是两个字母数字字符.filter()
,其中Boolean
作为参数从.split()
返回的数组中删除空字符串,使用index
.map()
来设置值对象,返回对象
var str = "[:pl]Field_value_in_PL[:en]Field_value_in_EN[:]:deField_value_in_DE";
var props = str.match(/:(\w{2})/g).map(function(val, index) {
var obj = {}
, prop = val.slice(1)
,vals = str.split(/\[:\w{2}\]|\[:\]|:\w{2}/).filter(Boolean);
obj[prop] = vals[index];
return obj
});
console.log(JSON.stringify(props, null, 2))
答案 1 :(得分:1)
使用String.replace
,String.split
和Array.forEach
函数的解决方案:
var str = "[:pl]Field_value_in_PL[:en]Field_value_in_EN[:fr]Field_value_in_FR[:de]Field_value_in_DE[:]",
obj = {},
fragment = "";
var matches = str.replace(/\[:(\w+?)\]([a-zA-Z_]+)/gi, "$1/$2|").split('|');
matches.forEach(function(v){ // iterating through key/value pairs
fragment = v.split("/");
if (fragment.length == 2) obj[fragment[0]] = fragment[1]; // making sure that we have a proper 'final' key/value pair
});
console.log(obj);
// the output:
Object { pl: "Field_value_in_PL", en: "Field_value_in_EN", fr: "Field_value_in_FR", de: "Field_value_in_DE" }
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split
答案 2 :(得分:0)
您可以尝试使用此正则表达式在一个组中捕获一对括号内的内容,在另一组中捕获括号后面的单词组。
(\[.*?\])(\w+)