最初の空白スペースで文字列を分割する


149

最初の空白の出現に基づいて文字列を分割する最適化された正規表現を取得しませんでした。

var str="72 tocirah sneab";

私は得る必要があります:

[
    "72",
    "tocirah sneab",
]

1
「最適化」とはどういう意味ですか?それ正規表現でなければなりませんか?
Deestan 2012

時間をかけて@georgの回答までスクロールしてください-美しいstackoverflow.com/a/10272828/93910
Sanjay Manohar

回答:


323

スペース文字のみを扱い(タブや他の空白文字は含まず)、最初のスペースの前のすべてと最初のスペースの後のすべてを考慮する場合は、次のような正規表現なしで実行できます。

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

スペースがない場合、最初の行は空の文字列を返し、2行目は文字列全体を返します。それがその状況で必要な動作であること(またはその状況が発生しないこと)を確認してください。


49

JavaScriptは後読みをサポートしていないため、split不可能です。match動作します:

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

別のトリック:

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

どのように:

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

そして、なぜ

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

または多分

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

2019の更新:ES2018以降、後読みがサポートされています:

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


str.match(/^(\S+)\s(.*)/).slice(1) スペースのない文字列に対しては機能しません
Junaid

29

ES6では、次のこともできます

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

2
私はこれがかなり好きで、うまく機能しましたが、パフォーマンスに関しては、最も支持されている「サブストリング」ソリューションにとってはかなり悪いです。ちょうどそれをテストし、それは約10倍遅いです。
pootzko 2016

18

ゲームの後半では、私は知っていますが、これを行う非常に簡単な方法があるようです:

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

これはarr[0]"72"arr[1]一緒に残され"tocirah sneab"ます。arr [2]は空になりますが、無視してかまいません。

参考のため:

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


これにより、最後の空白要素が生成されることに注意してください。
Benjamin Intal

13
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"];

しかし、私はまだより速い方法があると思います。


11

georgのソリューションは優れていますが、文字列に空白が含まれていない場合は機能しません。文字列に空白が含まれていない可能性がある場合は、次のように.splitとキャプチャグループを使用する方が安全です。

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

9

.replaceを使用して、最初の出現のみを置き換えることもできます。

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

/ gを除外します。

デモ


3
@DannyHerran ..いいえ、違いますか?コードをテストしましたか?/ g修飾子はありません。グローバルではありません。 コードの機能を理解する前に、コードをテストしてみてください。3つの主要なブラウザでもテストされています。なぜあなたが何をしていると思うのか知りたい。
Daedalus 14

私はこれを常に欠陥と見なしてきたので、それは賢いことです。これが利用されているのを目にしたのはこれが初めてです:)
Gogol

2

文字列を配列に分割し、必要な部分を接着します。このアプローチは非常に柔軟性があり、多くの状況で機能し、簡単に推論できます。さらに、必要な関数呼び出しは1つだけです。

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

または、必要なものを文字列から直接選択したい場合は、次のようにすることができます。

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

またはこのように:

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

ただし、最初の例をお勧めします。

作業デモ:jsbin


このような!「短所」がありますか?
iglesiasedd 2017年

0

クラスのリストまたはクラス名またはIDの一部からクラスを取得する必要がある場合は常に、split()を使用してから、配列インデックスを使用して具体的に取得するか、ほとんどの場合、pop()を使用して取得します。最初の要素を取得する最後の要素またはshift()。

この例では、divのクラス「gallery_148 ui-sortable」を取得し、ギャラリーID 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 

私はそれをより少ない行に圧縮できると確信していますが、読みやすくするために拡張したままにしました。


0

少し違う結果が必要でした。

最初の言葉が欲しかったし、その後何が来たのか-それが空白だったとしても。

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

したがって、入力のoneword場合はとを取得oneword''ます。

入力の場合は、とone word and some moreを取得oneword and some moreます。


0

他のすべての回答がなぜそれほど複雑であるかはわかりません。1行ですべてを実行でき、スペースの不足も処理できる場合です。

例として、名前の最初と「その他」のコンポーネントを取得してみましょう:

let [first, last] = 'John Von Doe'.split(/ (.*)/);
console.log({ first, last });

[first, last] = 'Surma'.split(/ (.*)/);
console.log({ first, last });


-1

次の関数は常に文を2つの要素に分割します。最初の要素には最初の単語のみが含まれ、2番目の要素には他のすべての単語が含まれます(または空の文字列になります)。

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;
}

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.