web-dev-qa-db-fra.com

Fractionner la chaîne lors de la première occurrence d'espace blanc

Je n'ai pas eu de regex optimisée qui m'a divisé une chaîne basée sur la première occurrence d'espace blanc:

var str="72 tocirah sneab";

J'ai besoin d'avoir:

[
    "72",
    "tocirah sneab",
]
129
Luca

Si vous vous souciez uniquement du caractère d'espace (et non des tabulations ou d'autres caractères d'espacement) et que vous vous souciez uniquement de tout ce qui se trouve avant le premier espace et de tout ce qui suit le premier espace, vous pouvez le faire sans expression régulière comme celle-ci:

str.substr(0,str.indexOf(' ')); // "72"
str.substr(str.indexOf(' ')+1); // "tocirah sneab"

Notez que s'il n'y a pas d'espace du tout, la première ligne renverra une chaîne vide et la deuxième ligne renverra la chaîne entière. Assurez-vous que c'est le comportement que vous souhaitez dans cette situation (ou que cette situation ne se produira pas).

289
Trott

Javascript ne supporte pas les lookbehind, donc split n'est pas possible. match fonctionne:

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

Une autre astuce:

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

que diriez-vous:

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

et pourquoi pas

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

ou peut-être

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

Mise à jour 2019: à partir de ES2018, les recherches sont prises en charge:

str = "72 tocirah sneab"
s = str.split(/(?<=^\S+)\s/)
console.log(s)
45
georg

Dans ES6, vous pouvez également

let [first, ...second] = str.split(" ")
second = second.join(" ")
26
user1652176

Tard au jeu, je sais mais il semble y avoir un moyen très simple de faire ceci:

const str = "72 tocirah sneab";
const arr = str.split(/ (.*)/);
console.log(arr);

Cela laissera arr[0] avec "72" et arr[1] avec "tocirah sneab". Notez que arr [2] sera vide, mais vous pouvez simplement l'ignorer.

Pour référence:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split#Capturing_parentheses

14
Cliff Stanford
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"];

mais je pense toujours qu'il existe un moyen plus rapide cependant.

13
Joseph

la solution de georg est Nice, mais se casse si la chaîne ne contient aucun espace. Si vos chaînes ont une chance de ne pas contenir d'espaces, il est préférable d'utiliser .split et de capturer des groupes comme ceci:

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

Vous pouvez également utiliser .replace pour ne remplacer que la première occurrence,

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

Laissant le/g.

DÉMO

9
Daedalus

Il suffit de scinder la chaîne en un tableau et de coller les éléments dont vous avez besoin. Cette approche est très flexible, elle fonctionne dans de nombreuses situations et il est facile de raisonner. De plus, vous n’avez besoin que d’un appel de fonction.

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

Alternativement, si vous voulez sélectionner ce dont vous avez besoin directement dans la chaîne, vous pouvez faire quelque chose comme ceci:

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

Ou comme ceci:

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

Cependant, je suggère le premier exemple.

Démo de travail: jsbin

2
Rotareti

Chaque fois que j'ai besoin d'obtenir une classe à partir d'une liste de classes ou d'une partie d'un nom de classe ou d'un identifiant de classe, j'utilise toujours split (), puis l'obtenir spécifiquement avec l'index de tableau ou, le plus souvent dans mon cas, pop () pour obtenir le dernier élément ou shift () pour obtenir le premier.

Cet exemple obtient les classes de la div "gallery_148 ui-sortable" et renvoie l'identifiant de la galerie 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 

Je suis sûr que cela pourrait être compacté en moins de lignes mais je l'ai laissé étendu pour plus de lisibilité.

0
acarito

J'avais besoin d'un résultat légèrement différent.

Je voulais la première Parole, et ce qu’elle vint après, même si elle était vierge.

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

ainsi, si l'entrée est oneword, vous obtenez oneword et ''.

Si l'entrée est one Word and some more, vous obtenez one et Word and some more.

0
jim.richards