Obter Substring entre dois caracteres usando javascript


194

Eu estou tentando extrair uma seqüência de dentro de uma seqüência maior, onde fica tudo entre um ':' e um ';'.

Atual

Str = 'MyLongString:StringIWant;'

Saída desejada

newStr = 'StringIWant'

Respostas:


424

Você pode tentar isso

var mySubString = str.substring(
    str.lastIndexOf(":") + 1, 
    str.lastIndexOf(";")
);

4
Solução trivial, mas útil, especialmente se você deseja evitar expressões regulares.
Nikolay Frick

8
Alguém sabe como eu faria isso para cada ocorrência de uma substring entre minha string inicial e final?
MarksCode

6
@VirtualTroll 8 seg? Santo inferno, eu quero ver a sua "solução": D
tom

@ Tom, apesar de "8 segundos", sem contexto não ter qualquer informação significativa - mas eu tenho certeza que não é uma diferença de uma única corrida)
ego

7
Tenho certeza que ele quer dizer que esta resposta foi postada 8 segundos antes da dele. Enquanto ele escrevia.
MaxSantos 11/02/19

110

Você também pode tentar isso:

var str = 'one:two;three';    
str.split(':').pop().split(';')[0]; // returns 'two'

13
Sem regex. Adoro.
precisa

str.split(':').pop().split(';')[0]pode ser mais rápido do que usar.shift()
MysteryPancake

48

Usar split()

var s = 'MyLongString:StringIWant;';
var arrStr = s.split(/[:;]/);
alert(arrStr);

arrStrconterá toda a string delimitada por :ou ;
então acesse todas as strings atravésfor-loop

for(var i=0; i<arrStr.length; i++)
    alert(arrStr[i]);

A string que eu quero está entre [] e isso não está funcionando ... ex: 'MyLongString [StringIWant]'. Split (/ [[]] /);
Philippe

1
@ Philippe Para seu caso de uso, use este regex \[(.*?)\] ---> Em resumo, você precisa escapar entre colchetes, pois [] indica a classe de caracteres no regex.
asifsid88

33

@Babasaheb Gosavi A resposta é perfeita se você tiver uma ocorrência das substrings (":" e ";"). mas uma vez que você tenha várias ocorrências, pode ser um pouco complicado.


A melhor solução que encontrei para trabalhar em vários projetos é usar quatro métodos dentro de um objeto.

  • Primeiro método: é realmente obter uma substring entre duas strings (no entanto, ele encontrará apenas um resultado).
  • Segundo método: removerá o (possível) resultado encontrado mais recentemente com as substrings antes e depois dele.
  • Terceiro método: fará os dois métodos acima recursivamente em uma string.
  • Quarto método: aplicará o terceiro método e retornará o resultado.

Código

Então chega de conversa, vamos ver o código:

var getFromBetween = {
    results:[],
    string:"",
    getFromBetween:function (sub1,sub2) {
        if(this.string.indexOf(sub1) < 0 || this.string.indexOf(sub2) < 0) return false;
        var SP = this.string.indexOf(sub1)+sub1.length;
        var string1 = this.string.substr(0,SP);
        var string2 = this.string.substr(SP);
        var TP = string1.length + string2.indexOf(sub2);
        return this.string.substring(SP,TP);
    },
    removeFromBetween:function (sub1,sub2) {
        if(this.string.indexOf(sub1) < 0 || this.string.indexOf(sub2) < 0) return false;
        var removal = sub1+this.getFromBetween(sub1,sub2)+sub2;
        this.string = this.string.replace(removal,"");
    },
    getAllResults:function (sub1,sub2) {
        // first check to see if we do have both substrings
        if(this.string.indexOf(sub1) < 0 || this.string.indexOf(sub2) < 0) return;

        // find one result
        var result = this.getFromBetween(sub1,sub2);
        // push it to the results array
        this.results.push(result);
        // remove the most recently found one from the string
        this.removeFromBetween(sub1,sub2);

        // if there's more substrings
        if(this.string.indexOf(sub1) > -1 && this.string.indexOf(sub2) > -1) {
            this.getAllResults(sub1,sub2);
        }
        else return;
    },
    get:function (string,sub1,sub2) {
        this.results = [];
        this.string = string;
        this.getAllResults(sub1,sub2);
        return this.results;
    }
};

Como usar?

Exemplo:

var str = 'this is the haystack {{{0}}} {{{1}}} {{{2}}} {{{3}}} {{{4}}} some text {{{5}}} end of haystack';
var result = getFromBetween.get(str,"{{{","}}}");
console.log(result);
// returns: [0,1,2,3,4,5]

Obtendo uma RangeError: Maximum call stack size exceededexceção.
Alejandro Cotilla 23/04

1
Ótima resposta. isso era exatamente o que eu precisava.
Andres Felipe

20
var s = 'MyLongString:StringIWant;';
/:([^;]+);/.exec(s)[1]; // StringIWant

1
Qual é o propósito de; em [^;]
Jaakko Karhu

2
a tradução é: "/" inicia o padrão. Combine um ":" com "[]" qualquer coisa de "^;" não ponto e vírgula "+" repetidamente e, em seguida, encontre um ";" ponto e vírgula e "/" finalizam o padrão.
DeveloperWeeks

15

Eu gosto deste método:

var str = 'MyLongString:StringIWant;';
var tmpStr  = str.match(":(.*);");
var newStr = tmpStr[1];
//newStr now contains 'StringIWant'

Testei isso em uma Webpart do SharePoint 2013 e funcionou muito bem se isso ajudar alguém no futuro!
Shane Gib.

3
Este trabalho não pode, se o string que você quer é entre "(" e ")"
bravokeyl

4

Eu usei @tsds way, mas usando apenas a função split.

var str = 'one:two;three';    
str.split(':')[1].split(';')[0] // returns 'two'

palavra de cautela: se não houver ":" na cadeia de caracteres que acessa o índice '1' da matriz, ocorrerá um erro! str.split (':') [1]

portanto, @tsds way é mais seguro se houver incerteza

str.split(':').pop().split(';')[0]

4
function substringBetween(s, a, b) {
    var p = s.indexOf(a) + a.length;
    return s.substring(p, s.indexOf(b, p));
}

// substringBetween('MyLongString:StringIWant;', ':', ';') -> StringIWant
// substringBetween('MyLongString:StringIWant;;', ':', ';') -> StringIWant
// substringBetween('MyLongString:StringIWant;:StringIDontWant;', ':', ';') -> StringIWant

Esta é uma excelente solução para seqüências de caracteres entre 2 caracteres
Phani Shashank 27/01

3

Você pode usar uma função de ordem superior para retornar uma versão 'compilada' do seu extrator, para que seja mais rápido.

Com regexes e compilando o regex uma vez em um fechamento, a correspondência do Javascript retornará todas as correspondências.

Isso nos deixa tendo apenas que remover o que usamos como nossos marcadores (ou seja:) {{e podemos usar o comprimento da string para isso com fatia.

function extract([beg, end]) {
    const matcher = new RegExp(`${beg}(.*?)${end}`,'gm');
    const normalise = (str) => str.slice(beg.length,end.length*-1);
    return function(str) {
        return str.match(matcher).map(normalise);
    }
}

Compile uma vez e use várias vezes ...

const stringExtractor = extract(['{','}']);
const stuffIneed = stringExtractor('this {is} some {text} that can be {extracted} with a {reusable} function');
// Outputs: [ 'is', 'text', 'extracted', 'reusable' ]

Ou uso único ...

const stuffIneed = extract(['{','}'])('this {is} some {text} that can be {extracted} with a {reusable} function');
// Outputs: [ 'is', 'text', 'extracted', 'reusable' ]

replaceObserve também a função Javascript, mas usando uma função para o argumento de substituição (você faria isso, por exemplo, se estivesse usando um mini mecanismo de modelo (interpolação de strings) ... lodash.get também poderia ser útil para obter os valores desejados substituir com ? ...

Minha resposta é muito longa, mas pode ajudar alguém!


2

Você também pode usar este ...

function extractText(str,delimiter){
  if (str && delimiter){
    var firstIndex = str.indexOf(delimiter)+1;
    var lastIndex = str.lastIndexOf(delimiter);
    str = str.substring(firstIndex,lastIndex);
  }
  return str;
}


var quotes = document.getElementById("quotes");

// &#34 - represents quotation mark in HTML
<div>


  <div>
  
    <span id="at">
      My string is @between@ the "at" sign
    </span>
    <button onclick="document.getElementById('at').innerText = extractText(document.getElementById('at').innerText,'@')">Click</button>
  
  </div>
  
  <div>
    <span id="quotes">
      My string is "between" quotes chars
    </span>
    <button onclick="document.getElementById('quotes').innerText = extractText(document.getElementById('quotes').innerText,'&#34')">Click</button>
  
  </div>

</div>


2

obter string entre para substrings (contém mais de 1 caractere)

function substrInBetween(whole_str, str1, str2){
  strlength1 = str1.length;
  return whole_str.substring(
                whole_str.indexOf(str1) + strlength1, 
                whole_str.indexOf(str2)
               );

   }

Note que eu uso em indexOf()vez de, lastIndexOf()portanto, ele verificará as primeiras ocorrências dessas strings


Função agradável e muito legível. Mas qual é o propósito da strlength1variável? O valor deve ser usado em linha. Também não está claro qual estilo de caso você está usando. strlength1- sem estilo, whole_str- estojo de cobra.
Boris


1

Usando jQuery :

get_between <- function(str, first_character, last_character) {
    new_str = str.match(first_character + "(.*)" + last_character)[1].trim()
    return(new_str)
    }

corda

my_string = 'and the thing that ! on the @ with the ^^ goes now' 

uso :

get_between(my_string, 'that', 'now')

resultado :

"! on the @ with the ^^ goes

1

Uma pequena função que eu criei que pode pegar a string entre, e pode (opcionalmente) pular várias palavras correspondentes para pegar um índice específico.

Além disso, definir startpara falseusará o início da sequência e definir endcomofalse usará o final da string.

definido pos1na posição do starttexto que você deseja usar, 1usará a primeira ocorrência destart

pos2faz a mesma coisa que pos1, mas para end, e 1usará a primeira ocorrência de endsomente depois start, as ocorrências de endantes startsão ignoradas.

function getStringBetween(str, start=false, end=false, pos1=1, pos2=1){
  var newPos1 = 0;
  var newPos2 = str.length;

  if(start){
    var loops = pos1;
    var i = 0;
    while(loops > 0){
      if(i > str.length){
        break;
      }else if(str[i] == start[0]){
        var found = 0;
        for(var p = 0; p < start.length; p++){
          if(str[i+p] == start[p]){
            found++;
          }
        }
        if(found >= start.length){
          newPos1 = i + start.length;
          loops--;
        }
      }
      i++;
    }
  }

  if(end){
    var loops = pos2;
    var i = newPos1;
    while(loops > 0){
      if(i > str.length){
        break;
      }else if(str[i] == end[0]){
        var found = 0;
        for(var p = 0; p < end.length; p++){
          if(str[i+p] == end[p]){
            found++;
          }
        }
        if(found >= end.length){
          newPos2 = i;
          loops--;
        }
      }
      i++;
    }
  }

  var result = '';
  for(var i = newPos1; i < newPos2; i++){
    result += str[i];
  }
  return result;
}

1

Esta poderia ser a solução possível

var str = 'RACK NO:Stock;PRODUCT TYPE:Stock Sale;PART N0:0035719061;INDEX NO:21A627 042;PART NAME:SPRING;';  
var newstr = str.split(':')[1].split(';')[0]; // return value as 'Stock'

console.log('stringvalue',newstr)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.