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'
Roubar
fonte

Respostas:

424

Você pode tentar isso

var mySubString = str.substring(
    str.lastIndexOf(":") + 1, 
    str.lastIndexOf(";")
);
Babasaheb Gosavi
fonte
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'
tsds
fonte
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]);
asifsid88
fonte
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]
Alex C.
fonte
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
otakustay
fonte
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'
Shane Gib.
fonte
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]
Timar Ivo Batis
fonte
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
bianbian
fonte
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!

Ooki Koi
fonte
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>

Meir Gabay
fonte
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

principiante
fonte
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

Tente fazer isso para obter substring entre dois caracteres usando javascript.

        $("button").click(function(){
            var myStr = "MyLongString:StringIWant;";
            var subStr = myStr.match(":(.*);");
            alert(subStr[1]);
        });

Retirado de @ Localizar substring entre os dois caracteres com jQuery

Ketan Savaliya
fonte
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
Cibernético
fonte
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;
}
SwiftNinjaPro
fonte
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)
Mahendren
fonte