سؤال

لدي سلسلة تبدو التالية 'اختبار:1 ؛ مرحبا:خمسة فقط:23'.مع هذه السلسلة لا تحتاج إلى أن تكون قادرة على القيام بما يلي.

....
var test = MergeTokens('test:1;hello:five;just:23', 'yes:23;test:567');
...

وينبغي أن تكون النتيجة النهائية 'اختبار:567;مرحبا:خمسة فقط:23 ؛ نعم:23' (ملاحظة الترتيب الدقيق من الرموز ليست بتلك الأهمية).

فقط أتساءل عما إذا كان أي شخص لديه أي أفكار ذكية من كيفية التوجه نحو ذلك.كنت أفكر regex محل كل الرموز على حق و إذا كان محل لم يحدث لأنه لم يكن هناك مباراة فقط إلحاق ذلك.ولكن ربما هناك طريقة أفضل.

هتافات أنتوني

تحرير:الجانب الأيمن يجب تجاوز اليسار.اليسار ما كان أصلا هناك الجانب الأيمن كونه محتوى جديد.طريقة أخرى للنظر في ذلك ، هو أن تبقي فقط على الرموز على اليسار إذا لم تكن موجودة على اليمين و على مستوى جميع الرموز على اليمين.

@فرديناند شكرا على الرد.المشكلة هي الكفاءة التي حل لك المقترحة.كنت في البداية التفكير أسفل خطوط مماثلة ولكن مخفضة ذلك بسبب O(n*z) تعقد دمج (حيث n و z هو عدد الرموز على اليسار واليمين على التوالي) ناهيك عن تقسيم الانضمام.

وبالتالي لماذا كنت أحاول أن ننظر إلى أسفل مسار regex.ربما وراء الكواليس ، regex هو مجرد سيئة أو أسوأ من ذلك ، ولكن وجود regex الذي يزيل أي رمز من اليسار سلسلة موجود على اليمين (O(n) مجموع مبلغ رمزي على اليمين) ثم فقط إضافة 2 سلسلة معا (أيضريبة القيمة المضافة اختبار = test1 + test2) يبدو أكثر كفاءة.شكرا

هل كانت مفيدة؟

المحلول 2

ما يلي هو ما انتهت thiking عن.ماذا يا رفاق ريكون ؟

شكرا أنتوني

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;

نصائح أخرى

وأود أن استخدام 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(';');
}

باستخدام هذه ، دمج سهل:

// 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);
}

فائدة وظائف مفيدة أيضا إذا كنت ترغب في استخراج بعض مفاتيح (ويقول ، "اختبار") و/أو التحقق من وجود:

var data = splitTokens(str);
if (data["test"] === undefined) {
    // Does not exist
} else {
    alert("Value of 'test': " + data["test"]);
}

أنا بضع سنوات في وقت متأخر ، ولكن أعتقد أن هذا هو ما كنت أبحث عنه:

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;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top