在第一个空格出现处拆分字符串

Luc*_*uca 135 javascript regex

我没有得到一个优化的正则表达式,它将一个字符串分成第一个空白区域:

var str="72 tocirah sneab";
Run Code Online (Sandbox Code Playgroud)

我需要得到:

[
    "72",
    "tocirah sneab",
]
Run Code Online (Sandbox Code Playgroud)

Tro*_*ott 298

如果您只关心空格字符(而不是制表符或其他空白字符)并且只关心第一个空格之前的所有内容以及第一个空格之后的所有内容,则可以不使用如下的正则表达式:

str.substr(0,str.indexOf(' ')); // "72"
str.substr(str.indexOf(' ')+1); // "tocirah sneab"
Run Code Online (Sandbox Code Playgroud)

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

  • @MitraArdron 人们倾向于对他们认为有帮助的答案进行投票。答案的第一句提到了这个答案仅考虑空格而不考虑其他空白字符的事实。由于原始海报接受了答案,因此他们似乎希望“空白”表示“空格字符”而不是“任何空白字符”。话虽如此,发布答案(或编辑以添加到现有答案)以解释所有空白是一件富有成效且受欢迎的事情。 (5认同)

geo*_*org 45

Javascript不支持lookbehinds,所以split不可能.match作品:

str.match(/^(\S+)\s(.*)/).slice(1)
Run Code Online (Sandbox Code Playgroud)

另一招:

str.replace(/\s+/, '\x01').split('\x01')
Run Code Online (Sandbox Code Playgroud)

怎么样:

[str.replace(/\s.*/, ''), str.replace(/\S+\s/, '')]
Run Code Online (Sandbox Code Playgroud)

那么为何不

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

或者可能

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


小智 27

在ES6中你也可以

let [first, ...second] = str.split(" ")
second = second.join(" ")
Run Code Online (Sandbox Code Playgroud)

  • 我相当喜欢它,它可以正常工作,但从性能角度来看,这对于最受好评的“子字符串”解决方案来说是非常糟糕的。刚刚测试过,速度慢了大约10倍。 (2认同)

小智 15

在游戏的后期,我知道但似乎有一种非常简单的方法:

const str = "72 tocirah sneab";
const arr = str.split(/ (.*)/);
console.log(arr);
Run Code Online (Sandbox Code Playgroud)

这将使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

  • 请注意,这会产生最后一个空白元素。 (2认同)

Jos*_*eph 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"];
Run Code Online (Sandbox Code Playgroud)

但我仍然认为有更快的方法.


小智 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
Run Code Online (Sandbox Code Playgroud)


Dae*_*ica 9

你也可以使用.replace来替换第一次出现,

?str = str.replace(' ','<br />');
Run Code Online (Sandbox Code Playgroud)

离开/ g.

DEMO

  • @DannyHerran ..不,不会吗?你有没有测试过代码?没有/ g修饰符.它不是全球性的.[尝试在知道它的用途之前测试代码](http://jsfiddle.net/LWCZj/).在三个主流浏览器中也进行了测试.我想知道你为什么这么想. (3认同)

Dan*_*scu 5

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

例如,让我们获取名称的第一个和“其余”组件:

const [first, rest] = 'John Von Doe'.split(/\s+(.*)/);
console.log({ first, rest });

// As array
const components = 'Surma'.split(/\s+(.*)/);
console.log(components);
Run Code Online (Sandbox Code Playgroud)