Como substituir a última ocorrência de } em uma string multilinha em Javascript?
O método de como substituir a última ocorrência de uma palavra em javascript? não funciona no caso de uma string multilinha:
"line1}hello\n}\nline2}abc".replace(/(.*)}/g, "$1");
// "line1hello\n\nline2abc"
porque neste caso tudo }
é substituído, o que eu não quero.
Nota: não é uma duplicata de Substituir a última ocorrência de caractere na string porque minha pergunta é especificamente sobre strings multilinhas, e a pergunta vinculada não é.
Você só precisa alterar o modificador de
g
(global) paras
(linha única):Você não precisa
g
de nada, pois deseja realizar uma única partida.Por padrão, o regex é executado por linha, mas o uso
s
tratará a string de entrada como uma única linha.Você pode usar algo assim:
Explicação Regex:
/
- iniciar delimitador\}
- encontrar chave de fechamento literal(?=[^}]*$)
- à minha frente não há outra chave de fechamento até o final da string (não a linha)/
- delimitador finalAo não usar o sinalizador multiline
/m
, ele$
se comporta como um meta escape de fim de string em vez de fim de linha.https://regex101.com/r/Ausg5r/1
Observe que o PCRE possui um meta escape dedicado para o final da string,
\z
mas o JS não.Você pode usar
/}(?=[^\n]*$)/gm
for remove}
em todas as linhas.Este regex funciona procurando um
}
caractere que não seja seguido por outro}
caractere em qualquer lugar do restante da string.