Obtenga una subcadena entre dos caracteres usando javascript

196

Estoy tratando de extraer una cadena dentro de una cadena más grande donde obtiene todo entre ':' y ';'.

Actual

Str = 'MyLongString:StringIWant;'

Salida deseada

newStr = 'StringIWant'
Robar
fuente

Respuestas:

428

Puedes probar esto

var mySubString = str.substring(
    str.lastIndexOf(":") + 1, 
    str.lastIndexOf(";")
);
Babasaheb Gosavi
fuente
44
Solución trivial pero útil, especialmente si desea evitar expresiones regulares.
Nikolay Frick
8
¿Alguien sabe cómo haría esto para cada aparición de una subcadena entre mi cadena inicial y final?
MarksCode
66
@VirtualTroll 8 segundos? Santo infierno, quiero ver tu "solución": D
tom
@tom, aunque "8 segundos" sin contexto no contiene ninguna información significativa, pero estoy bastante seguro de que no es la diferencia de una sola carrera)
ego
77
Estoy seguro de que quiere decir que esta respuesta se publicó 8 segundos antes que la suya. Mientras lo escribía.
MaxSantos
111

También puedes probar esto:

var str = 'one:two;three';    
str.split(':').pop().split(';')[0]; // returns 'two'
tsds
fuente
13
Sin expresiones regulares. Quiéralo.
flimflam57
str.split(':').pop().split(';')[0]puede ser más rápido que usarlo.shift()
MysteryPancake
48

Utilizar split()

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

arrStrcontendrá toda la cadena delimitada por :o ;
Así accederá a cada cadena a través defor-loop

for(var i=0; i<arrStr.length; i++)
    alert(arrStr[i]);
asifsid88
fuente
La cadena que quiero está entre [] y esto no funciona ... ej .: 'MyLongString [StringIWant]'. Split (/ [[]] /);
Philippe
1
@Philippe Para su caso de uso, use esta expresión regular \[(.*?)\] ---> En resumen, necesita escapar de corchetes, ya que [] denota la clase de caracteres en la expresión regular.
asifsid88
33

@Babasaheb Gosavi La respuesta es perfecta si tiene una aparición de las subcadenas (":" y ";"). pero una vez que tiene múltiples ocurrencias, puede ser un poco complicado.


La mejor solución que se me ocurrió para trabajar en múltiples proyectos es usar cuatro métodos dentro de un objeto.

  • Primer método: es obtener una subcadena entre dos cadenas (sin embargo, solo encontrará un resultado).
  • Segundo método: eliminará el (posible) resultado encontrado más recientemente con las subcadenas después y antes.
  • Tercer método: hará los dos métodos anteriores de forma recursiva en una cadena.
  • Cuarto método: aplicará el tercer método y devolverá el resultado.

Código

Hablando bastante, veamos el 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;
    }
};

¿Cómo utilizar?

Ejemplo:

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.
fuente
Obteniendo una RangeError: Maximum call stack size exceededexcepción.
Alejandro Cotilla
1
Gran respuesta. Esto era justo lo que necesitaba.
Andrés Felipe
20
var s = 'MyLongString:StringIWant;';
/:([^;]+);/.exec(s)[1]; // StringIWant
otakustay
fuente
1
Cual es el proposito de ; en [^;]
Jaakko Karhu
2
la traducción es: "/" inicia el patrón. Haga coincidir un ":" con "[]" cualquier cosa de "^;" no punto y coma "+" repetidamente y luego encuentre un ";" punto y coma y "/" finalizan el patrón.
DeveloperWeeks
15

Me gusta este metodo:

var str = 'MyLongString:StringIWant;';
var tmpStr  = str.match(":(.*);");
var newStr = tmpStr[1];
//newStr now contains 'StringIWant'
Shane Gib.
fuente
¡Probé esto en un elemento web de SharePoint 2013 y funcionó muy bien si eso ayuda a alguien en el futuro!
Shane Gib
3
Esto puede no funcionar si la cadena que desea está entre "(" y ")"
bravokeyl
4

Utilicé @tsds pero solo con la función de división.

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

advertencia: si no hay ":" en la cadena que accede al índice '1' de la matriz, se producirá un error. str.split (':') [1]

por lo tanto, la forma @tsds es más segura si hay incertidumbre

str.split(':').pop().split(';')[0]
Timar Ivo Batis
fuente
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
fuente
Esta es una excelente solución para cadenas entre 2 caracteres
Phani Shashank
3

Puede usar una función de orden superior para devolver una versión 'compilada' de su extractor, de esa manera es más rápido.

Con expresiones regulares, y compilando las expresiones regulares una vez en un cierre, la coincidencia de Javascript devolverá todas las coincidencias.

Esto nos deja con solo tener que eliminar lo que usamos como nuestros marcadores (es decir:) {{y podemos usar la longitud de la cadena para esto con el corte.

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 vez y usa varias veces ...

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 de una sola vez ...

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

También mire los Javascript replace función pero use una función para el argumento de reemplazo (lo haría si, por ejemplo, estuviera haciendo un mini motor de plantillas (interpolación de cadenas) ... lodash.get también podría ser útil para obtener los valores que desea reemplazar con ? ...

¡Mi respuesta es demasiado larga pero podría ayudar a alguien!

Ooki Koi
fuente
2

También puedes 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
fuente
2

Obtener una cadena entre dos subcadenas (contiene más de 1 carácter)

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

   }

Tenga en cuenta que uso en indexOf()lugar de, lastIndexOf()por lo que verificará las primeras ocurrencias de esas cadenas

principiante
fuente
Función agradable y muy legible. ¿Pero cuál es el propósito de la strlength1variable? El valor debe usarse en línea en su lugar. Tampoco está claro qué estilo de caja está utilizando. strlength1- sin estilo, whole_str- estuche de serpiente.
Boris
1

Intente esto para obtener una subcadena entre dos caracteres usando javascript.

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

Tomado de @ Buscar subcadena entre los dos caracteres con jQuery

Ketan Savaliya
fuente
1

Usando jQuery :

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

cuerda

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
fuente
1

Una pequeña función que hice que puede agarrar la cadena entre, y puede (opcionalmente) omitir varias palabras coincidentes para agarrar un índice específico.

Además, la configuración startde falseutilizará el comienzo de la cadena y la configuración endde falseutilizará el final de la cadena.

configurado pos1en la posición del starttexto que desea utilizar, 1utilizará la primera aparición destart

pos2hace lo mismo que pos1, pero para end, y 1usará la primera ocurrencia de endsolo después start, las ocurrencias de endantes startse ignoran.

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
fuente
1

Esta podría ser la posible solución.

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
fuente