Ottieni sottostringa tra due caratteri usando javascript


196

Sto cercando di estrarre una stringa all'interno di una stringa più grande in cui ottiene tutto tra un ':' e un ';'.

attuale

Str = 'MyLongString:StringIWant;'

Uscita desiderata

newStr = 'StringIWant'

Risposte:


428

Puoi provare questo

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

4
Soluzione essenziale ma utile soprattutto se si desidera evitare espressioni regolari.
Nikolay Frick,

8
Qualcuno sa come lo farei per ogni occorrenza di una sottostringa tra la mia stringa iniziale e finale?
MarksCode

6
@VirtualTroll 8 sec? Santo inferno, voglio vedere la tua "soluzione": D
tom,

@tom sebbene "8 sec" senza contesto non rechi alcuna informazione significativa - ma sono abbastanza sicuro che non sia la differenza di una singola corsa)
ego

7
Sono sicuro che intende dire che questa risposta è stata pubblicata 8 secondi prima della sua. Mentre lo stava scrivendo.
MaxSantos,

111

Puoi anche provare questo:

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

13
Nessuna regex. Lo adoro.
flimflam57,

str.split(':').pop().split(';')[0]potrebbe essere più veloce dell'uso.shift()
MysteryPancake il

48

Uso split()

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

arrStrconterrà tutte le stringhe delimitate da :o ;
quindi accedi ad ogni stringa attraversofor-loop

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

La stringa che voglio è tra [] e questo non funziona ... es: 'MyLongString [StringIWant]'. Split (/ [[]] /);
Philippe,

1
@Philippe Per il tuo caso d'uso, usa questo regex \[(.*?)\] ---> In breve, devi sfuggire alle parentesi quadre, poiché [] indica la classe di caratteri in regex.
asifsid88,

33

@Babasaheb Gosavi La risposta è perfetta se si verifica un'occorrenza delle sottostringhe (":" e ";"). ma una volta che hai più ricorrenze, potrebbe diventare un po 'complicato.


La migliore soluzione che mi è venuta in mente per lavorare su più progetti è usare quattro metodi all'interno di un oggetto.

  • Primo metodo: ottenere effettivamente una sottostringa tra due stringhe (tuttavia troverà un solo risultato).
  • Secondo metodo: rimuoverà il (potenziale) risultato trovato più di recente con le sottostringhe dopo e prima di esso.
  • Terzo metodo: eseguirà i due metodi sopra ricorsivamente su una stringa.
  • Quarto metodo: applica il terzo metodo e restituisce il risultato.

Codice

Quindi, parlando abbastanza, vediamo il codice:

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;
    }
};

Come usare?

Esempio:

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]

Ottenere RangeError: Maximum call stack size exceededun'eccezione.
Alejandro Cotilla,

1
Bella risposta. questo era proprio quello di cui avevo bisogno.
Andres Felipe,

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

1
Qual è lo scopo di; in [^;]
Jaakko Karhu,

2
la traduzione è: "/" avvia il modello. Abbina un ":" a "[]" qualunque cosa di "^;" non punto e virgola "+" ripetutamente e quindi trovare un ";" punto e virgola e "/" terminano il motivo.
DeveloperWeeks

15

Mi piace questo metodo:

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

L'ho testato in una webpart di SharePoint 2013 e ha funzionato alla grande se questo aiuta qualcuno in futuro!
Shane Gib.

3
Questo potrebbe non funzionare se la stringa desiderata è compresa tra "(" e ")"
bravokeyl

4

Ho usato il modo @tsds ma usando solo la funzione split.

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

avvertenza: se non ci sono ":" nella stringa che accede all'indice '1' dell'array genererà un errore! str.split ( ':') [1]

quindi il modo @tsds è più sicuro se c'è incertezza

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

Questa è un'ottima soluzione per stringhe tra 2 caratteri
Phani Shashank,

3

Puoi utilizzare una funzione di ordine superiore per restituire una versione "compilata" del tuo estrattore, in questo modo è più veloce.

Con regex e compilando il regex una volta chiuso, la partita di Javascript restituirà tutte le partite.

Questo ci lascia solo dover rimuovere ciò che abbiamo usato come marcatori (cioè:) {{e possiamo usare la lunghezza della stringa per questo con slice.

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);
    }
}

Compila una volta e usa più volte ...

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

O uso singolo ...

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

Guarda anche la replacefunzione di Javascript ma usando una funzione per l'argomento di sostituzione (Lo faresti se, ad esempio, facessi un motore mini template (interpolazione di stringhe) ... lodash.get potrebbe anche essere utile per ottenere i valori che desideri sostituirlo con ? ...

La mia risposta è troppo lunga ma potrebbe aiutare qualcuno!


2

Puoi anche usare questo ...

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

Ottieni una stringa tra due sottostringhe (contiene più di 1 carattere)

function substrInBetween(whole_str, str1, str2){
   if (whole_str.indexOf(str1) === -1 || whole_str.indexOf(str2) === -1) {
       return undefined; // or ""
  }
  strlength1 = str1.length;
  return whole_str.substring(
                whole_str.indexOf(str1) + strlength1, 
                whole_str.indexOf(str2)
               );

   }

Nota che uso indexOf()invece di lastIndexOf()così controllerà le prime occorrenze di quelle stringhe


Funzione piacevole e molto leggibile. Ma qual è lo scopo della strlength1variabile? Il valore dovrebbe essere usato invece in linea. Inoltre, non è chiaro quale stile di caso si sta utilizzando. strlength1- nessuno stile, whole_str- custodia per serpenti.
Boris,


1

Utilizzando 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' 

utilizzo :

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

risultato :

"! on the @ with the ^^ goes

1

Una piccola funzione che ho fatto che può afferrare la stringa tra, e può (facoltativamente) saltare un numero di parole abbinate per afferrare un indice specifico.

Inoltre, l'impostazione startsu falseutilizzerà l'inizio della stringa e l'impostazione endto falseutilizzerà la fine della stringa.

impostato pos1sulla posizione del starttesto che si desidera utilizzare, 1utilizzerà la prima occorrenza distart

pos2fa la stessa cosa di pos1, ma per end, e 1utilizzerà la prima occorrenza di endsolo dopo start, le occorrenze di endprima startvengono ignorate.

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

Questa potrebbe essere la possibile soluzione

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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.