Ich habe keinen optimierten regulären Ausdruck erhalten, der mich in einen String aufteilt, der auf dem ersten Leerraum basiert:
var str="72 tocirah sneab";
Ich benötige:
[
"72",
"tocirah sneab",
]
Ich habe keinen optimierten regulären Ausdruck erhalten, der mich in einen String aufteilt, der auf dem ersten Leerraum basiert:
var str="72 tocirah sneab";
Ich benötige:
[
"72",
"tocirah sneab",
]
Antworten:
Wenn Sie sich nur um das Leerzeichen (und nicht um Tabulatoren oder andere Leerzeichen) kümmern und sich nur um alles vor dem ersten Leerzeichen und alles nach dem ersten Leerzeichen kümmern, können Sie dies ohne einen regulären Ausdruck wie diesen tun:
str.substr(0,str.indexOf(' ')); // "72"
str.substr(str.indexOf(' ')+1); // "tocirah sneab"
Beachten Sie, dass in der ersten Zeile eine leere Zeichenfolge und in der zweiten Zeile die gesamte Zeichenfolge zurückgegeben wird, wenn überhaupt kein Leerzeichen vorhanden ist. Stellen Sie sicher, dass dies das Verhalten ist, das Sie in dieser Situation wünschen (oder dass diese Situation nicht auftritt).
Javascript unterstützt keine Lookbehinds, split
ist also nicht möglich. match
funktioniert:
str.match(/^(\S+)\s(.*)/).slice(1)
Ein weiterer Trick:
str.replace(/\s+/, '\x01').split('\x01')
wie wäre es mit:
[str.replace(/\s.*/, ''), str.replace(/\S+\s/, '')]
und warum nicht
reverse = function (s) { return s.split('').reverse().join('') }
reverse(str).split(/\s(?=\S+$)/).reverse().map(reverse)
oder vielleicht
re = /^\S+\s|.*/g;
[].concat.call(re.exec(str), re.exec(str))
Update 2019 : Ab ES2018 werden Lookbehinds unterstützt:
str = "72 tocirah sneab"
s = str.split(/(?<=^\S+)\s/)
console.log(s)
str.match(/^(\S+)\s(.*)/).slice(1)
funktioniert nicht für eine Zeichenfolge, die keinen Platz hat
In ES6 können Sie auch
let [first, ...second] = str.split(" ")
second = second.join(" ")
Ich weiß, dass ich zu spät zum Spiel komme, aber es scheint einen sehr einfachen Weg zu geben, dies zu tun:
const str = "72 tocirah sneab";
const arr = str.split(/ (.*)/);
console.log(arr);
Dies wird arr[0]
mit "72"
und arr[1]
mit verlassen"tocirah sneab"
. Beachten Sie, dass arr [2] leer ist, Sie es jedoch einfach ignorieren können.
Als Referenz:
Georgs Lösung ist nett, bricht aber, wenn die Zeichenfolge kein Leerzeichen enthält. Wenn Ihre Zeichenfolgen möglicherweise keine Leerzeichen enthalten, ist es sicherer, .split zu verwenden und Gruppen wie folgt zu erfassen:
str_1 = str.split(/\s(.+)/)[0]; //everything before the first space
str_2 = str.split(/\s(.+)/)[1]; //everything after the first space
Sie können .replace auch verwenden, um nur das erste Vorkommen zu ersetzen.
str = str.replace(' ','<br />');
Das / g weglassen.
Teilen Sie einfach die Zeichenfolge in ein Array und kleben Sie die benötigten Teile zusammen. Dieser Ansatz ist sehr flexibel, funktioniert in vielen Situationen und ist leicht zu überlegen. Außerdem benötigen Sie nur einen Funktionsaufruf.
arr = str.split(' '); // ["72", "tocirah", "sneab"]
strA = arr[0]; // "72"
strB = arr[1] + ' ' + arr[2]; // "tocirah sneab"
Alternativ können Sie Folgendes tun, wenn Sie direkt aus der Zeichenfolge auswählen möchten, was Sie benötigen:
strA = str.split(' ')[0]; // "72";
strB = str.slice(strA.length + 1); // "tocirah sneab"
Oder so:
strA = str.split(' ')[0]; // "72";
strB = str.split(' ').splice(1).join(' '); // "tocirah sneab"
Ich schlage jedoch das erste Beispiel vor.
Wenn ich eine Klasse aus einer Liste von Klassen oder einem Teil eines Klassennamens oder einer ID abrufen muss, verwende ich immer split () und erhalte sie dann entweder speziell mit dem Array-Index oder, in meinem Fall meistens, mit pop () das letzte Element oder shift (), um das erste zu erhalten.
In diesem Beispiel werden die Klassen des div "gallery_148 ui-sortable" abgerufen und die Galerie-ID 148 zurückgegeben.
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
Ich bin sicher, dass es in weniger Zeilen komprimiert werden könnte, aber ich habe es zur besseren Lesbarkeit erweitert gelassen.
Ich brauchte ein etwas anderes Ergebnis.
Ich wollte das erste Wort und was auch immer danach kam - auch wenn es leer war.
str.substr(0, text.indexOf(' ') == -1 ? text.length : text.indexOf(' '));
str.substr(text.indexOf(' ') == -1 ? text.length : text.indexOf(' ') + 1);
Also, wenn die Eingabe ist, erhalten oneword
Sie oneword
und ''
.
Wenn die Eingabe ist, erhalten one word and some more
Sie one
und word and some more
.
Ich bin mir nicht sicher, warum alle anderen Antworten so kompliziert sind, wenn Sie alles in einer Zeile erledigen können und auch den Platzmangel bewältigen.
Lassen Sie uns als Beispiel die erste und "andere" Komponente eines Namens erhalten:
let [first, last] = 'John Von Doe'.split(/ (.*)/);
console.log({ first, last });
[first, last] = 'Surma'.split(/ (.*)/);
console.log({ first, last });
Die folgende Funktion wird immer geteilt , den Satz in 2 Elemente. Das erste Element enthält nur das erste Wort und das zweite Element enthält alle anderen Wörter (oder es ist eine leere Zeichenfolge).
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;
}