Javascript令牌替换/追加
我有一个字符串,看起来像下面的测试:1;你好:五,;刚:23’。使用此字符串,我需要能够执行以下操作Javascript令牌替换/追加,javascript,regex,merge,replace,token,Javascript,Regex,Merge,Replace,Token,我有一个字符串,看起来像下面的测试:1;你好:五,;刚:23’。使用此字符串,我需要能够执行以下操作 .... var test = MergeTokens('test:1;hello:five;just:23', 'yes:23;test:567'); ... 最终结果应该是“测试:567;你好:五,;公正:23;是:23”(注意代币的确切顺序并不那么重要) 只是想知道是否有人对如何进行这件事有什么聪明的想法。我想在右边的每个标记上都替换一个正则表达式,如果因为不匹配而没有替换,只需附加它。
....
var test = MergeTokens('test:1;hello:five;just:23', 'yes:23;test:567');
...
最终结果应该是“测试:567;你好:五,;公正:23;是:23”(注意代币的确切顺序并不那么重要)
只是想知道是否有人对如何进行这件事有什么聪明的想法。我想在右边的每个标记上都替换一个正则表达式,如果因为不匹配而没有替换,只需附加它。但也许有更好的办法
干杯
安东尼
编辑:右侧应覆盖左侧。左边是原来的内容,右边是新内容。另一种看待它的方式是,如果令牌不存在于右侧,则只将其保留在左侧,而将所有令牌保留在右侧
@Ferdinand
谢谢你的回复。问题在于你提出的解决方案的效率。我最初考虑的是类似的行,但由于合并的O(n*z)复杂性(其中n和z分别是左侧和右侧的数字标记),更不用说拆分和合并了,所以没有考虑
因此,我试图寻找正则表达式的路径。也许在幕后,正则表达式同样糟糕或更糟,但是有一个正则表达式可以从右边的左字符串中删除任何令牌(右边的令牌总量为O(n)),然后将这两个字符串加在一起(即vat test=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(';');
}
我将使用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(';');
}
以下是我结束思考的内容。你们侦察什么 谢谢 安东尼
function Tokenizer(input, tokenSpacer, tokenValueSpacer) {
this.Tokenizer = {};
this.TokenSpacer = tokenSpacer;
this.TokenValueSpacer = tokenValueSpacer;
if (input) {
var TokenizerParts = input.split(this.TokenSpacer);
var i, nv;
for (i = 0; i < TokenizerParts.length; i++) {
nv = TokenizerParts[i].split(this.TokenValueSpacer);
this.Tokenizer[nv[0]] = nv[1];
}
}
}
Tokenizer.prototype.add = function(name, value) {
if (arguments.length == 1 && arguments[0].constructor == Object) {
this.addMany(arguments[0]);
return;
}
this.Tokenizer[name] = value;
}
Tokenizer.prototype.addMany = function(newValues) {
for (nv in newValues) {
this.Tokenizer[nv] = newValues[nv];
}
}
Tokenizer.prototype.remove = function(name) {
if (arguments.length == 1 && arguments[0].constructor == Array) {
this.removeMany(arguments[0]);
return;
}
delete this.Tokenizer[name];
}
Tokenizer.prototype.removeMany = function(deleteNames) {
var i;
for (i = 0; i < deleteNames.length; i++) {
delete this.Tokenizer[deleteNames[i]];
}
}
Tokenizer.prototype.MergeTokenizers = function(newTokenizer) {
this.addMany(newTokenizer.Tokenizer);
}
Tokenizer.prototype.getTokenString = function() {
var nv, q = [];
for (nv in this.Tokenizer) {
q[q.length] = nv + this.TokenValueSpacer + this.Tokenizer[nv];
}
return q.join(this.TokenSpacer);
}
Tokenizer.prototype.toString = Tokenizer.prototype.getTokenString;
函数标记器(输入、标记间隔符、标记值间隔符){
this.Tokenizer={};
this.TokenSpacer=TokenSpacer;
this.TokenValueSpacer=TokenValueSpacer;
如果(输入){
var TokenizerParts=input.split(this.TokenSpacer);
var i,内华达州;
对于(i=0;i
以下是我结束思考的内容。你们侦察什么
谢谢
安东尼
function Tokenizer(input, tokenSpacer, tokenValueSpacer) {
this.Tokenizer = {};
this.TokenSpacer = tokenSpacer;
this.TokenValueSpacer = tokenValueSpacer;
if (input) {
var TokenizerParts = input.split(this.TokenSpacer);
var i, nv;
for (i = 0; i < TokenizerParts.length; i++) {
nv = TokenizerParts[i].split(this.TokenValueSpacer);
this.Tokenizer[nv[0]] = nv[1];
}
}
}
Tokenizer.prototype.add = function(name, value) {
if (arguments.length == 1 && arguments[0].constructor == Object) {
this.addMany(arguments[0]);
return;
}
this.Tokenizer[name] = value;
}
Tokenizer.prototype.addMany = function(newValues) {
for (nv in newValues) {
this.Tokenizer[nv] = newValues[nv];
}
}
Tokenizer.prototype.remove = function(name) {
if (arguments.length == 1 && arguments[0].constructor == Array) {
this.removeMany(arguments[0]);
return;
}
delete this.Tokenizer[name];
}
Tokenizer.prototype.removeMany = function(deleteNames) {
var i;
for (i = 0; i < deleteNames.length; i++) {
delete this.Tokenizer[deleteNames[i]];
}
}
Tokenizer.prototype.MergeTokenizers = function(newTokenizer) {
this.addMany(newTokenizer.Tokenizer);
}
Tokenizer.prototype.getTokenString = function() {
var nv, q = [];
for (nv in this.Tokenizer) {
q[q.length] = nv + this.TokenValueSpacer + this.Tokenizer[nv];
}
return q.join(this.TokenSpacer);
}
Tokenizer.prototype.toString = Tokenizer.prototype.getTokenString;
函数标记器(输入、标记间隔符、标记值间隔符){
this.Tokenizer={};
this.TokenSpacer=TokenSpacer;
this.TokenValueSpacer=TokenValueSpacer;
如果(输入){
var TokenizerParts=input.split(this.TokenSpacer);
var i,内华达州;
对于(i=0;i
我迟到了几年,但我想这就是你想要的:
function MergeTokens(input, replace){
var replaceTokens = replace.split(";");
for(i=0; i<replaceTokens.length; i++){
var pair = replaceTokens[i].split(":");
var result = input;
regString = "\\b" + pair[0] + ":[\\w]*\\b";
var reg = new RegExp(regString);
if(reg.test(result)){
result = result.replace(reg, replaceTokens[i]);
}
else{
result = result + replaceTokens[i];
}
}
return result;
}
函数合并令牌(输入、替换){
var replaceTokens=replace.split(“;”);
对于(i=0;i我迟到了几年,但我认为这正是你想要的:
function MergeTokens(input, replace){
var replaceTokens = replace.split(";");
for(i=0; i<replaceTokens.length; i++){
var pair = replaceTokens[i].split(":");
var result = input;
regString = "\\b" + pair[0] + ":[\\w]*\\b";
var reg = new RegExp(regString);
if(reg.test(result)){
result = result.replace(reg, replaceTokens[i]);
}
else{
result = result + replaceTokens[i];
}
}
return result;
}
函数合并令牌(输入、替换){
var replaceTokens=replace.split(“;”);
对于(i=0;iWas在FireBug控制台中键入几乎相同并检查代码:)在FireBug控制台中键入几乎相同并检查代码:)哈希表(JavaScript对象)中的查找是O(1),因此合并操作是线性的,而不是O(n²)。即使regex有能力做您想要的事情,您也无法做得更好(它不能)酷,这是我知道的…哈希表(JavaScript对象)中的查找是O(1),所以合并是O(1)