2 votes

Recherche de valeurs de type Placeholder dans 2 chaînes de caractères

J'ai deux chaînes de caractères en JavaScript comme

var description = "<DP_A>.<Del.Dce Lks.{Link}>.<Pl.Rrs Bk 0.310-PT-304_({strm})>"

var Title = "<DP_A>.<Del.Dce Lks.1>.<Pl.Rrs Bk 0.310-PT-304_(1)>"

ici, {Link} et {strm} sont des espaces réservés ou, plus probablement, tout ce qui se trouve entre { } est un espace réservé.

J'ai besoin de comparer les deux chaînes de caractères comme la description et le titre pour trouver des valeurs de placeholder, la sortie doit être comme suit

 {"Link" : 1, "strm" : 1 }

ou tableau

[{Link" : 1, "strm" : 1}]

J'ai essayé quelques RegEx mais ça ne marche pas, une aide ?

 if (description.includes("{")) {
                        var found = [],          // an array to collect the strings that are found
                         rxp = /{([^}]+)}/g,
                         curMatch;
                        while (curMatch = rxp.exec(description)) {
                            found.push(curMatch[1]);
                        }

                       }

Je suis capable d'obtenir un tableau de Placeholders mais je ne peux pas trouver les valeurs dans la chaîne de titre.

2voto

Nina Scholz Points 17120

Vous pourriez obtenir toutes les parties et ensuite extraire les valeurs de la chaîne de titre.

"<DP_A>.<Del.Dce Lks.{Link}>.<Pl.Rrs Bk 0.310-PT-304_({strm})>",
"<DP_A>.<Del.Dce Lks. 1    >.<Pl.Rrs Bk 0.310-PT-304_( 1    )>";

function getParts(pattern, values) {
    var result = {}, value, p1, p2 = 0;
    (pattern.match(/[^{}]+/g) || []).forEach((s, i, a) => {
        if (i % 2) return Object.assign(result, { [s]: value });
        p1 = values.indexOf(s, p2),
        p2 = values.indexOf(a[i + 2], p1);
        value = values.slice(p1 + s.length, p2 === -1 ? undefined : p2);
    });
    return result;
}

var description = "<DP_A>.<Del.Dce Lks.{Link}>.<Pl.Rrs Bk 0.310-PT-304_({strm})>{last}",
    title = "<DP_A>.<Del.Dce Lks.abcdef>.<Pl.Rrs Bk 0.310-PT-304_(ghijklöööö)>fubar";

console.log(getParts(description, title));

Avec un for et la réutilisation de positions connues.

function getParts(pattern, values) {
    var parts = pattern.match(/[^{}]+/g),
        result = {}, p1, p2, i;
    if (!parts || parts.length < 2) return {};
    p1 = values.indexOf(parts[0]);
    for (i = 1; i < parts.length; i += 2) {
        p2 = values.indexOf(parts[i + 1], p1);
        Object.assign(result, { [parts[i]]: values.slice(p1 + parts[i - 1].length, p2 === -1 ? undefined : p2) });
        p1 = p2;
    }
    return result;
}

var description = "&lt;DP_A&gt;.&lt;Del.Dce Lks.{Link}&gt;.&lt;Pl.Rrs Bk 0.310-PT-304_({strm})&gt;{last}",
    title = "&lt;DP_A&gt;.&lt;Del.Dce Lks.abcdef&gt;.&lt;Pl.Rrs Bk 0.310-PT-304_(ghijklöööö)&gt;fubar";

console.log(getParts(description, title));

0voto

briosheje Points 3141

Ok, c'est beaucoup plus complexe que ce à quoi je m'attendais.

Je ne suis pas très doué pour ce genre d'opérations, mais voici une solution "fonctionnelle" : il se peut que vous souhaitiez la réécrire un peu, mais le concept me semble tout de même correct.

Les étapes suivies pour obtenir ces résultats sont les suivantes :

  • Acquérir tous les index de "{". J'ai utilisé un générateur de fonctions ci-dessous, mais vous pouvez utiliser les autres critères que vous voulez. Le but est d'acquérir le crochet de départ de chaque correspondance.
  • Bouclez chaque crochet correspondant, recherchez le crochet fermant et acquérez le caractère juste après dans la chaîne de description.
  • effectuer la correspondance de valeur sur la chaîne Titre.
  • Continuez en appliquant les valeurs correspondantes actuelles pour mettre à jour les décalages.
  • Mettez en correspondance le résultat pour collecter le résultat souhaité : J'ai intentionnellement retourné un tableau d'éléments parce qu'un placeholder peut exister deux fois.

Quelques notes secondaires :

  • Le script ci-dessous, comme mentionné ci-dessus, ne prendra pas en charge les cas limites comme "{hello{world}".
  • Le script ci-dessous peut être amélioré en faisant correspondre à la fois le caractère précédent et le caractère suivant.
  • Le script ci-dessous pourrait échouer dans certaines situations, il se trouve qu'il fonctionne dans ce cas, mais je ne l'ai pas testé avec des cas limites.

    var description = "<DPA>.<Del.Dce Lks.{Link}>.<Pl.Rrs Bk 0.310-PT-304({strm})>"; var Title = "<DPA>.<Del.Dce Lks.1>.<Pl.Rrs Bk 0.310-PT-304(1)>";

    // Acquire all the indexes of every "{". // BEWARE: This will actually fail if the description is "&LT{LLT{hello}", but you may change this. const descriptionLookupIndexes = [].concat(...(function*(){ for (var i = 0; i < description.length; i++) { if (description[i] === "{") yield [i]; } })());

    let matches = []; descriptionLookupIndexes.forEach((i, index) => { // acquire the description by replacing the currently known values. let _replacedDescription = description; let _replacedDescriptionIndex = i - matches.reduce((a,b) => a + b.amount, 0); // This foreach will replace the placeholders already found with their respective values. matches.forEach(k => { let splitted = _replacedDescription.split(''); splitted.splice(k.from, k.amount, [k.value.split('')]); _replacedDescription = splitted.join(''); }); // Acquire the relevant portion of the string. const needle = _replacedDescription.substring(_replacedDescriptionIndex, _replacedDescription.length); // Look for the next character after the first } occurrence in the current substring. const nextChar = needle[needle.indexOf("}") + 1]; // Acquire the relevant substring for the title. const titleNeedle = Title.substring(_replacedDescriptionIndex, Title.length); matches.push({ from: _replacedDescriptionIndex, amount: needle.match(/[^{}]+(?=})/g)[0].length + 1, needle: needle.match(/[^{}]+(?=})/g)[0], value: titleNeedle.substring(0, titleNeedle.indexOf(nextChar)) }); });

    // Matches is now the array with all the occurrences, let's just map it to acquire a new array of objects with the desired format. // BEWARE: If multiple keys exists, they will be mapped to an array.

    const res = matches.reduce((acc, next) => { accnext.needle = accnext.needle || []; accnext.needle.push({ }); return acc; }, {}); console.log(res);

0voto

Jack Bashford Points 34617

Utilisez replace :

var description = "&lt;DP_A&gt;.&lt;Del.Dce Lks.{Link}&gt;.&lt;Pl.Rrs Bk 0.310-PT-304_({strm})&gt;"
const obj = { 
  Link: 1,
  strm: 2
};
const res = description.replace(/{(.*?)}/g, m => obj[m.slice(1, -1)]);

document.write(res);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X