JavaScript substring: extraia texto por índice
O método substring do JavaScript extrai caracteres entre duas posições de índice e retorna uma nova string. Ele aceita um índice inicial e um índice final opcional (exclusivo), pegando tudo do início até antes do fim. Quando o índice final é omitido, a extração continua até o fim da string. Diferente de slice, substring troca os argumentos automaticamente quando o início é maior que o fim, evitando resultados vazios acidentais.
Exemplo de JavaScript Substring para extração de texto
Saída:
A saída aparecerá aqui...
Saída:
Nome: relatorio-2024
Extensão: csv
Como este exemplo funciona
nomeArquivo.lastIndexOf(".")retorna14, a posição do último ponto na string.nomeArquivo.substring(0, 14)extrai caracteres do índice0até (sem incluir) o índice14, produzindo"relatorio-2024".nomeArquivo.substring(15)omite o argumento final, então a extração vai do índice15até o fim da string, retornando"csv".- As duas chamadas retornam novas strings; o
nomeArquivooriginal nunca é modificado porque strings em JavaScript são imutáveis.
Erros comuns com JavaScript substring
Esperar que índices negativos contem a partir do fim.
Errado:
"hello".substring(-3); // "hello", não "llo"
Certo:
"hello".slice(-3); // "llo"
substring ajusta valores negativos para 0, então substring(-3) vira substring(0) e retorna a string inteira. Use slice para deslocamentos relativos ao fim.
Tratar o segundo argumento como comprimento.
Errado:
"abcdef".substring(2, 3); // "c", não "cde"
Certo:
"abcdef".substring(2, 5); // "cde"
O segundo parâmetro é um índice final, não uma contagem de caracteres. Essa confusão costuma vir do substr(start, length) legado, em que "abcdef".substr(2, 3) retorna "cde". Ao migrar de substr, converta o comprimento para índice final: start + length.
JavaScript substring vs slice
| Comportamento | substring(start, end) | slice(start, end) |
|---|---|---|
| Argumentos negativos | Ajustados para 0 | Contam a partir do fim da string |
start > end | Trocados automaticamente | Retorna string vazia "" |
| Índice fora do intervalo | Ajustado para string.length | Ajustado para string.length |
| Modifica o original | Não | Não |
Use substring quando os índices vêm de cálculos que podem chegar na ordem errada; a troca automática garante um resultado válido. Use slice quando deslocamentos negativos forem intencionais, como extrair os últimos N caracteres com str.slice(-N).
Substituindo substr legado por substring
O método legado substr(start, length) (muitas vezes chamado de JavaScript substr) ainda aparece em código antigo e está obsoleto na documentação. A confusão entre JavaScript substr e substring geralmente vem do significado diferente do segundo argumento: substr recebe comprimento, enquanto substring recebe índice final. Para migrar com segurança:
- Substitua
str.substr(start, length)porstr.substring(start, start + length). - Se
startpuder ser negativo, useslice(start, start + length)no lugar, porquesubstringajusta negativos para0. - Teste casos de borda em que
lengthé0, negativo ou omitido, já quesubstresubstringdivergem nessas entradas.
FAQ
Qual é a diferença entre JavaScript substring e slice?
Ambos extraem parte de uma string por índice, mas divergem em casos de borda. substring ajusta argumentos negativos para 0 e troca início/fim quando o início é maior. slice trata negativos como deslocamentos a partir do fim e retorna string vazia quando o início é maior que o fim. Para extração direta por índices positivos, os dois produzem o mesmo resultado.
JavaScript substring modifica a string original?
Não. Strings em JavaScript são imutáveis; todo método de string retorna uma nova string. A original permanece inalterada após qualquer chamada de substring. Atribua o resultado a uma variável para manter o trecho extraído.
O que acontece quando start é maior que end em substring?
substring troca os dois argumentos silenciosamente. "abcdef".substring(4, 1) se comporta como "abcdef".substring(1, 4) e retorna "bcd". Essa normalização evita surpresas com string vazia quando cálculos de índice produzem limites invertidos.