No obtuve una expresión regular optimizada que me dividió una cadena basada en la primera aparición de espacio en blanco:
var str="72 tocirah sneab";
Necesito conseguir:
[
"72",
"tocirah sneab",
]
No obtuve una expresión regular optimizada que me dividió una cadena basada en la primera aparición de espacio en blanco:
var str="72 tocirah sneab";
Necesito conseguir:
[
"72",
"tocirah sneab",
]
Respuestas:
Si solo te importa el carácter de espacio (y no las pestañas u otros caracteres de espacio en blanco) y solo te importa todo antes del primer espacio y todo después del primer espacio, puedes hacerlo sin una expresión regular como esta:
str.substr(0,str.indexOf(' ')); // "72"
str.substr(str.indexOf(' ')+1); // "tocirah sneab"
Tenga en cuenta que si no hay espacio, la primera línea devolverá una cadena vacía y la segunda línea devolverá toda la cadena. Asegúrese de que ese sea el comportamiento que desea en esa situación (o que esa situación no surja).
Javascript no soporta lookbehinds, así split
que no es posible match
trabajos:
str.match(/^(\S+)\s(.*)/).slice(1)
Otro truco:
str.replace(/\s+/, '\x01').split('\x01')
qué tal si:
[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))
Actualización de 2019 : a partir de ES2018, se admiten lookbehinds:
str = "72 tocirah sneab"
s = str.split(/(?<=^\S+)\s/)
console.log(s)
str.match(/^(\S+)\s(.*)/).slice(1)
no funcionará para una cadena que no tiene espacio
En ES6 también puedes
let [first, ...second] = str.split(" ")
second = second.join(" ")
Al final del juego, lo sé, pero parece que hay una manera muy simple de hacer esto:
const str = "72 tocirah sneab";
const arr = str.split(/ (.*)/);
console.log(arr);
Esto saldrá arr[0]
con "72"
y arr[1]
con "tocirah sneab"
. Tenga en cuenta que arr [2] estará vacío, pero puede ignorarlo.
Para referencia:
La solución de georg es buena, pero se rompe si la cadena no contiene ningún espacio en blanco. Si sus cadenas tienen la posibilidad de no contener espacios en blanco, es más seguro usar .split y capturar grupos de esta manera:
str_1 = str.split(/\s(.+)/)[0]; //everything before the first space
str_2 = str.split(/\s(.+)/)[1]; //everything after the first space
También puede usar .replace para reemplazar solo la primera aparición,
str = str.replace(' ','<br />');
Dejando fuera el / g.
Simplemente divida la cadena en una matriz y pegue las partes que necesita juntas. Este enfoque es muy flexible, funciona en muchas situaciones y es fácil razonar. 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 seleccionar lo que necesita directamente de la cadena, puede 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, sugiero el primer ejemplo.
Demostración de trabajo: jsbin
Siempre que necesito obtener una clase de una lista de clases o una parte de un nombre o id de clase, siempre uso split () y luego lo obtengo específicamente con el índice de matriz o, más a menudo en mi caso, pop () para obtener el último elemento o shift () para obtener el primero.
Este ejemplo obtiene las clases del div "gallery_148 ui-sortable" y devuelve el id de la galería 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 compactarse en menos líneas, pero lo dejé expandido para facilitar la lectura.
Necesitaba un resultado ligeramente diferente.
Quería la primera palabra, y lo que vino 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);
así que si la entrada se oneword
obtiene oneword
y''
.
Si la entrada es one word and some more
usted obtiene one
y word and some more
.
No estoy seguro de por qué todas las otras respuestas son tan complicadas, cuando puedes hacerlo todo en una línea, manejando la falta de espacio también.
Como ejemplo, obtengamos los primeros y "otros" componentes de un nombre:
let [first, last] = 'John Von Doe'.split(/ (.*)/);
console.log({ first, last });
[first, last] = 'Surma'.split(/ (.*)/);
console.log({ first, last });
La siguiente función siempre dividirá la oración en 2 elementos. El primer elemento contendrá solo la primera palabra y el segundo elemento contendrá todas las otras palabras (o será una cadena vacía).
var arr1 = split_on_first_word("72 tocirah sneab"); // Result: ["72", "tocirah sneab"]
var arr2 = split_on_first_word(" 72 tocirah sneab "); // Result: ["72", "tocirah sneab"]
var arr3 = split_on_first_word("72"); // Result: ["72", ""]
var arr4 = split_on_first_word(""); // Result: ["", ""]
function split_on_first_word(str)
{
str = str.trim(); // Clean string by removing beginning and ending spaces.
var arr = [];
var pos = str.indexOf(' '); // Find position of first space
if ( pos === -1 ) {
// No space found
arr.push(str); // First word (or empty)
arr.push(''); // Empty (no next words)
} else {
// Split on first space
arr.push(str.substr(0,pos)); // First word
arr.push(str.substr(pos+1).trim()); // Next words
}
return arr;
}