J'ai cette chaîne:

const string ="{* * test * { * username: {{username}} * } }";

Et je veux avoir au final quelque chose comme ça :

 "{\n\t\"username\": \"{{username}}\" \n}"

J'essaie de supprimer la première partie de la chaîne jusqu'à ce que le caractère "{" soit trouvé. Le premier doit être ignoré bien sûr.

Voici le code que j'essaye :

const deleteFirstLastCharacter = string.substr(1).slice(0, -1);
const deleteFirstPart = deleteFirstLastCharacter.split("* * test *").pop();
const replace = deleteFirstPart.replace(/\*/g, "\n\t");

La sortie que j'obtiens:

 { 
         username: {{username}} 
         }

La sortie que je veux : Afin de l'avoir vu comme ceci :

{
        "username": "{{username}}" 
}
0
brxnzaz 16 mars 2019 à 22:14

2 réponses

Meilleure réponse

Vous pouvez utiliser Regex si la syntaxe ne change pas :

.* \{ \* ([^:]+): ([^ ]+) \* } }

Le premier .* doit correspondre à {* * test *.
Le reste consiste à saisir le nom du champ (nom d'utilisateur) puis sa valeur, suivi de l'étoile et des accolades fermantes.

Lorsqu'il s'agit d'une correspondance, vous pouvez simplement le remplacer par :

{\n\t"$1": "$2"\n}

Ce qui donne la sortie suivante:

{
    "username": "{{username}}"
}

Voici un extrait:

const string = "{* * test * { * username: {{username}} * } }";
let output = string.replace(/.* \{ \* ([^:]+): ([^ ]+) \* } }/, '{\n\t"$1": "$2"\n}')
console.log(output)

Essayez cette expression régulière ici : https://regex101.com/r/FbJzRE/1

4
adiga 16 mars 2019 à 19:52

Permettez-moi d'ajouter une solution sans regex. Votre problème était que vous avez besoin d'un ordre différent de \n et \t dans les deux cas de { et }, donc cela ne fonctionnera pas avec un seul remplacement comme vous l'avez essayé.

Essayer:

"{* * test * { * username: {{username}} * } }"
  .substr(1)
  .slice(0, -1)
  .split("* * test *")
  .pop()
  .replace(" { *","{\n\t")
  .replace("* } ", "\t\n}");
1
JohnPan 22 avril 2019 à 12:22