2012-04-22 14 views
87

no he tenido una expresión regular optimizado que me dividir una cadena basando en el primer espacio ocurrencia blanco:Separar una cadena en el primer espacio de ocurrencia blanco

var str="72 tocirah sneab"; 

Necesito llegar:

72 
tocirah sneab 
+1

¿Qué quiere decir con "optimizado"? ¿* Tiene que * ser una expresión regular? – Deestan

+0

No, si hay otra forma, es bienvenido :) – Luca

+0

Por favor, tómese el tiempo para desplazarse hacia abajo a la respuesta de @ georg - hermoso http://stackoverflow.com/a/10272828/93910 –

Respuesta

218

Si sólo se preocupan por el carácter de espacio (y no pestañas u otros caracteres de espacio en blanco) y sólo se preocupan por todo antes del primer espacio y todo después de que el primer espacio, puede hacerlo sin una expresión regular como esto:

Tenga en cuenta que si no hay espacio en absoluto, la primera línea devolverá una cadena vacía y la segunda línea devolverá la cadena completa. Asegúrese de que ese es el comportamiento que desea en esa situación (o que esa situación no surgirá).

+0

¿Es esto más que 'str. dividir ('') [0] '? – Growler

10
var arr = [];    //new storage 
str = str.split(' ');  //split by spaces 
arr.push(str.shift()); //add the number 
arr.push(str.join(' ')); //and the rest of the string 

//arr is now: 
["72","tocirah sneab"]; 

pero sigo creyendo que hay una manera más rápida.

32

Javascript no es compatible con lookbehinds, por lo que split no es posible. match obras:

str.match(/^(\S+)\s(.*)/).slice(1) 

Otro truco:

str.replace(/\s+/, '\x01').split('\x01') 

¿qué tal:

[str.replace(/\s.*/, ''), str.replace(/\S+\s/, '')] 

y por qué no

reverse = function (s) { return s.split('').reverse().join('') } 
reverse(str).split(/\s(?=\S+$)/).reverse().map(reverse) 

o tal vez

re = /^\S+\s|.*/g; 
[].concat.call(re.exec(str), re.exec(str)) 
+2

Un buen micro tutorial de expresiones regulares :) – esp

5

También puede utilizar .replace sustituir sólo la primera aparición,

​str = str.replace(' ','<br />'); 

Dejando de lado la/g.

DEMO

+3

@DannyHerran .. No, ¿no? ¿Has probado el código? No hay modificador/g. No es global. [Intente probar el código antes de pretender saber lo que hace] (http://jsfiddle.net/LWCZj/). Probado en los tres principales navegadores también. Me gustaría saber por qué piensas lo que haces. – Daedalus

1

Cada vez que necesito para obtener una clase a partir de una lista de clases o una parte de un nombre de clase o ID, siempre uso split() entonces o bien entiendo específicamente con el índice de la matriz o, más a menudo en mi caso, pop() para obtener el último elemento o shift() para obtener el primero.

este ejemplo se obtienen las clases del div "gallery_148 ui-ordenable" y devuelve la galería Identificación del 148.

var galleryClass = $(this).parent().prop("class"); // = gallery_148 ui-sortable 
var galleryID = galleryClass.split(" ").shift(); // = gallery_148 
galleryID = galleryID.split("_").pop(); // = 148 
//or 
galleryID = galleryID.substring(8); // = 148 also, but less versatile 

Estoy seguro de que podría ser compactado en menos líneas, pero lo dejé ampliado para facilitar la lectura.

0

Necesitaba un resultado ligeramente diferente.

Quería la primera palabra, y lo que viniera después, incluso si estaba en blanco.

str.substr(0, text.indexOf(' ') == -1 ? text.length : text.indexOf(' ')); 
str.substr(text.indexOf(' ') == -1 ? text.length : text.indexOf(' ') + 1); 

por lo que si la entrada es oneword que presentamos lo oneword y ''.

Si la entrada es one word and some more obtienes one y word and some more.

13

En ES6 se puede también

let [first, ...second] = str.split(" ") 
second = second.join(" ") 
+0

Me gustó bastante y funciona bien, pero en cuanto al rendimiento, es bastante malo para la solución de "subcadena" más votada. acaba de probarlo y es aproximadamente 10 veces más lento. – pootzko

2

Sólo dividir la cadena en una matriz y pegar las piezas que necesita juntos. Este enfoque es muy flexible, funciona en muchas situaciones y es fácil razonar sobre ello. Además, solo necesita una llamada de función.

arr = str.split(' ');    // ["72", "tocirah", "sneab"] 
strA = arr[0];     // "72" 
strB = arr[1] + ' ' + arr[2];  // "tocirah sneab" 

Alternativamente, si desea cereza escoger lo que necesita directamente de la cadena que podría hacer algo como esto:

strA = str.split(' ')[0];     // "72"; 
strB = str.slice(strA.length + 1);   // "tocirah sneab" 

O así:

strA = str.split(' ')[0];     // "72"; 
strB = str.split(' ').splice(1).join(' '); // "tocirah sneab" 

Sin embargo, me sugerir el primer ejemplo.

demostración de trabajo: solución jsbin

+0

¡Te gusta esto! ¿Tienes "contras"? – iglesiasedd

+1

Gracias! No que yo sepa. – Rotareti

3

de Georg es agradable, pero se rompe si la cadena no contiene ningún espacio en blanco. Si sus cadenas tienen la oportunidad de no contener espacios en blanco, es más seguro utilizar .split y grupos de captura de este modo:

str_1 = str.split(/\s(.+)/)[0]; //everything before the first space 
str_2 = str.split(/\s(.+)/)[1]; //everything after the first space 
Cuestiones relacionadas