2010-05-20 35 views

Respuesta

64

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('|')]​);​​​​​ 

Here's a quick demo of it

+0

Esto es realmente mejor que la expresión regular, creo. Seleccionado como correcto, gracias! –

+2

Para aclarar, se divide en N partes y luego coloca el primero en una lista y une el resto en la misma lista. –

+0

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(). –

12

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]).

+1

Probó este código y funciona. 1+ para usar Regex. – Riley

+0

correctamente, que probablemente debería anclarse al principio. sin embargo, javascript regexen parece ser codicioso. – muhmuhten

+0

¡Ah, gracias por eso, eso debería funcionar! –

3

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", '|'); 
0

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.

88

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)]; 
+0

Esta también es una buena solución. –

+12

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

+0

¿Por qué esta solución es menos "divertida"? – Bentley4

1

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('|')); 
0

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

+0

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

+0

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! –

+0

Si usa str para su frase única, ¡ya sabe que no puede estar allí otra vez! : sonrisa malvada –

7

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í!"

+0

Esto no es lo que se pidió, también están buscando la primera parte faltante. – SmujMaiku

3

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"] 
0

É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 []; 
Cuestiones relacionadas