vdh*_*ant 1 javascript regex merge replace token
我有一个类似于以下'test:1; hello:five; just:23'的字符串.有了这个字符串,我需要能够做到以下几点.
....
var test = MergeTokens('test:1;hello:five;just:23', 'yes:23;test:567');
...
Run Code Online (Sandbox Code Playgroud)
最终结果应为'test:567; hello:five; just:23; yes:23'(注意令牌的确切顺序并不重要).
只是想知道是否有人对如何解决这个问题有任何明智的想法.我正在考虑在右边的每个令牌上使用正则表达式替换,如果由于没有匹配而没有发生替换只是附加它.但也许有更好的方法.
干杯安东尼
编辑:右侧应覆盖左侧.左边是原来的,右边是新内容.另一种看待它的方法是,如果右侧不存在令牌,则只保留左侧的令牌,并将所有令牌保持在右侧.
@Ferdinand 感谢您的回复.问题是您提出的解决方案的效率.我最初考虑类似的行,但由于合并的O(n*z)复杂性而打折扣(其中n和z分别是左右分别的数字标记),更不用说拆分和连接了.
因此,为什么我试图俯视正则表达式的路径.也许在幕后,正则表达式同样糟糕或更糟,但有一个正则表达式从右侧存在的左侧字符串中删除任何标记(右侧令牌总数为O(n))然后只需添加2个字符串在一起(即增值测试= test1 + test2)似乎更有效.谢谢
我将使用join()和split()创建一些实用程序函数来将令牌数据打包并解压缩到对象:
// Unpacks a token string into an object.
function splitTokens(str) {
var data = {}, pairs = str.split(';');
for (var i = 0; i < pairs.length; ++i) {
var pair = pairs[i].split(':');
data[pair[0]] = pair[1];
}
return data;
}
// Packs an object into a token string.
function joinTokens(data) {
var pairs = [];
for (var key in data) {
pairs.push(key + ":" + data[key]);
}
return pairs.join(';');
}
Run Code Online (Sandbox Code Playgroud)
使用这些,合并很容易:
// Merges all token strings (supports a variable number of arguments).
function mergeTokens() {
var data = {};
for (var i = 0; i < arguments.length; ++i) {
var d = splitTokens(arguments[i]);
for (var key in d) {
data[key] = d[key];
}
}
return joinTokens(data);
}
Run Code Online (Sandbox Code Playgroud)
如果要提取某些键(例如"test")和/或检查是否存在,实用程序函数也很有用:
var data = splitTokens(str);
if (data["test"] === undefined) {
// Does not exist
} else {
alert("Value of 'test': " + data["test"]);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2873 次 |
| 最近记录: |