¿Cómo puedo dividir una cadena solo una vez, es decir, hacer 1|Ceci n'est pas une pipe: | Oui
analizar en: ["1", "Ceci n'est pas une pipe: | Oui"]
?¿Separar cadena una vez en javascript?
no parece El límite de división para ayudar a ...
¿Cómo puedo dividir una cadena solo una vez, es decir, hacer 1|Ceci n'est pas une pipe: | Oui
analizar en: ["1", "Ceci n'est pas une pipe: | Oui"]
?¿Separar cadena una vez en javascript?
no parece El límite de división para ayudar a ...
Esto no es un enfoque bastante, pero funciona con una eficiencia decente:
var string = "1|Ceci n'est pas une pipe: | Oui";
var components = string.split('|');
alert([components.shift(), components.join('|')]);
que puede utilizar:
var splits = str.match(/([^|]*)\|(.*)/);
splits.shift();
La expresión regular divide la cadena en dos grupos iguales (entre paréntesis), el texto que precede a la primera | y el texto después Entonces, nosotros shift
el resultado para deshacerse de la coincidencia de cadena completa (splits[0]
).
Prueba esto:
function splitOnce(input, splitBy) {
var fullSplit = input.split(splitBy);
var retVal = [];
retVal.push(fullSplit.shift());
retVal.push(fullSplit.join(splitBy));
return retVal;
}
var whatever = splitOnce("1|Ceci n'est pas une pipe: | Oui", '|');
utilizar la funcionalidad de expresiones regulares javascript y tomar la primera expresión capturada
la RE probablemente se parecería a /^([^|]*)\|/
.
En realidad, solo necesita /[^|]*/
si ha validado que la cadena está formateada de tal manera, debido a la codicia de javascript.
Desea usar String.indexOf('|')
para obtener el índice de la primera aparición de '|'.
var i = s.indexOf('|');
var splits = [s.slice(0,i), s.slice(i+1)];
Esta también es una buena solución. –
No es tan "divertido" como el de Nick, pero probablemente sea más eficiente. También tenga en cuenta que '+ 1' debería ser la longitud de la cadena del separador, si hay más de un carácter. – devios1
¿Por qué esta solución es menos "divertida"? – Bentley4
Así como el mal como la mayoría de las respuestas hasta el momento:
var splits = str.split('|');
splits.splice(1, splits.length - 1, splits.slice(1).join('|'));
Una alternativa, enfoque a corto, además de los bienes de otros lugares, es el uso de replace()
's límite a su ventaja.
var str = "1|Ceci n'est pas une pipe: | Oui";
str.replace("|", "aUniquePhraseToSaySplitMe").split("aUniquePhraseToSaySplitMe");
Como @sreservoir señala en los comentarios, la única frase debe ser verdaderamente único - que no puede estar en la fuente que se está ejecutando esta dividida sobre, o tendrá que obtener la fracción de cadena en más piezas de lo que quieres Un personaje no imprimible, como él dice, puede hacer si está ejecutando esto en contra de la entrada del usuario (es decir, escrito en un navegador).
que solo funciona si la frase "única" no es confiable. si lee de un archivo de texto, esto es imposible. si lee del navegador, cualquier caracter de control no imprimible si es posible. la pestaña también funciona de maravilla. en cualquier caso, "aUniquePhraseToSaySplitMe" es casi definitivamente parte de la entrada, y por lo tanto es peligroso. – muhmuhten
Tiene razón, por supuesto. Mi ejemplo es solo un ejemplo con miras a explicar lo que se está haciendo de manera concisa. Incorporaré tu punto en la respuesta misma. ¡Gracias! –
Si usa str para su frase única, ¡ya sabe que no puede estar allí otra vez! : sonrisa malvada –
un trazador de líneas y la OMI, más simple:
var str = 'I | am super | cool | yea!';
str.split('|').slice(1).join('|');
Esto devuelve "h Super | fresca | sí!"
Esto no es lo que se pidió, también están buscando la primera parte faltante. – SmujMaiku
Si la cadena no contiene el delimitador @ la solución de NickCraver aún devolverá una matriz de dos elementos, el segundo es una cadena vacía. Prefiero el comportamiento para que coincida con el de división. Es decir, si la cadena de entrada no contiene el delimitador, devuelve solo una matriz con un solo elemento.
var splitOnce = function(str, delim) {
var components = str.split(delim);
var result = [components.shift()];
if(components.length) {
result.push(components.join(delim));
}
return result;
};
splitOnce("a b c d", " "); // ["a", "b c d"]
splitOnce("a", " "); // ["a"]
Éste es un poco más de tiempo, pero funciona como creo límite debe:
function split_limit(inString, separator, limit){
var ary = inString.split(separator);
var aryOut = ary.slice(0, limit - 1);
if(ary[limit - 1]){
aryOut.push(ary.slice(limit - 1).join(separator));
}
return aryOut;
}
console.log(split_limit("1|Ceci n'est pas une pipe: | Oui","|", 1));
console.log(split_limit("1|Ceci n'est pas une pipe: | Oui","|", 2));
console.log(split_limit("1|Ceci n'est pas une pipe: | Oui","|", 3));
console.log(split_limit("1|Ceci n'est pas une pipe: | Oui","|", 7));
https://jsfiddle.net/2gyxuo2j/
límite de cero devuelve resultados divertidos, pero en aras de la eficiencia, que dejó sacar el cheque por eso. Puede agregar esto como la primera línea de la función si lo necesita:
if(limit < 1) return [];
Esto es realmente mejor que la expresión regular, creo. Seleccionado como correcto, gracias! –
Para aclarar, se divide en N partes y luego coloca el primero en una lista y une el resto en la misma lista. –
Si desea obtener k tokens de la cadena en lugar de 1, haga lo mismo que el anterior, excepto que use components.splice (0, k) en lugar de components.shift(). –