Substitua um caractere de uma string

Sep 11 2020

Eu tenho um string que se parece com isso: [TITLE|prefix=a].

A partir dessa string, o texto |prefix=aé dinâmico. Portanto, pode ser qualquer coisa ou vazio. Eu gostaria de substituir (nesse caso) [TITLE|prefix=a]por [TITLE|prefix=a|suffix=z].

Portanto, a ideia é substituir ]de uma string que começa com [TITLE with |suffix=z].

Por exemplo, se a string for [TITLE|prefix=a], deve ser substituída por [TITLE|prefix=a|suffix=z]. Se for [TITLE], deve ser substituído por [TITLE|suffix=z]e assim por diante.

Como posso fazer isso com RegEx?

Eu tentei dessa forma, mas deu um erro:

let str = 'Lorem ipsum [TITLE|prefix=a] dolor [sit] amet [consectetur]';

const x = 'TITLE';

const regex = new RegExp(`([${x})*]`, 'gi'); str = str.replace(regex, "$1|suffix=z]");

console.log(str);

Eu também tentei escapar dos personagens [e] com, new RegExp(`(\[${x})*\]`, 'gi');mas isso não ajudou.

Respostas

3 WiktorStribiżew Sep 11 2020 at 13:12

Você precisa se lembrar de usar \\uma literal de string regular para definir uma única barra invertida literal.

Então, você precisa de um padrão como

/(\[TITLE(?:\|[^\][]*)?)]/gi

Veja a demonstração do regex . Detalhes:

  • (\[TITLE\|[^\][]*) - Capturando grupo 1:
    • \[TITLE- [TITLEtexto
    • (?:\|[^\][]*)?- uma ocorrência opcional de um |caractere seguido por 0 ou mais caracteres diferentes de ]e[
  • ]- um ]char.

Dentro de seu código JavaScript, use o seguinte para definir o padrão dinâmico:

const regex = new RegExp(`(\\[${x}\\|[^\\][]*)]`, 'gi');

Veja a demonstração JS:

let str = 'Lorem ipsum [TITLE|prefix=a] dolor [sit] amet [consectetur] [TITLE]';
const x = 'TITLE';
const regex = new RegExp(`(\\[${x}(?:\\|[^\\][]*)?)]`, 'gi');
str = str.replace(regex, "$1|suffix=z]");
console.log(str);
// => Lorem ipsum [TITLE|prefix=a|suffix=z] dolor [sit] amet [consectetur]

nemoinho Sep 11 2020 at 13:16

Acho que a solução para o seu problema seria semelhante a esta:

let str = 'Lorem ipsum [TITLE|prefix=a] dolor [sit] amet [consectetur]';

str = str.replace(/(\[[^\|\]]+)(\|[^\]]*)?\]/g, "$1$2|suffix=z]");

console.log(str);