在第一个空白出现时分割字符串


Answers:


323

如果您只关心空格字符(而不是制表符或其他空白字符),并且只关心第一个空格之前的所有内容和第一个空格之后的所有内容,则可以在没有正则表达式的情况下执行以下操作:

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

请注意,如果根本没有空格,那么第一行将返回一个空字符串,第二行将返回整个字符串。确保这是您在那种情况下想要的行为(或者那种情况不会发生)。


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开始,支持lookbehinds:

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

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/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/split#Capturing_parentheses


请注意,这将生成最后一个空白元素。
本杰明·因塔尔

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修饰符。这不是全球性的。 在声称知道它会做什么之前,请尝试对其进行测试。在三种主要的浏览器中也进行了测试。我想知道你为什么认为自己在做什么。
Daedalus 2014年

这很聪明,因为我一直认为这是一个缺陷。这是我第一次看到这是在利用:)
Gogol,

2

只需将字符串拆分成一个数组,然后将所需的部分粘合在一起即可。这种方法非常灵活,可以在许多情况下使用,并且很容易推理。另外,您只需要一个函数调用。

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

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

我不确定为什么所有其他答案都这么复杂,当您可以在一行中完成所有操作时,也可以解决空间不足的问题。

例如,让我们获取名称的第一个和“其他”组成部分:

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

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


-1

以下功能将始终将句子分为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;
}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.