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

Posted

技术标签:

【中文标题】在第一个空格出现时拆分字符串【英文标题】:Split string on the first white space occurrence 【发布时间】:2012-05-03 14:32:30 【问题描述】:

我没有得到一个优化的正则表达式,它根据第一个空格将我拆分为一个字符串:

var str="72 tocirah sneab";

我需要得到:

[
    "72",
    "tocirah sneab",
]

【问题讨论】:

“优化”是什么意思?它必须是一个正则表达式吗? 请花时间向下滚动到@georg 的答案——漂亮的***.com/a/10272828/93910 遗憾的是,许多答案实际上并没有回答指定“空白”而不是“空格”的问题。定义中也存在歧义 - 至于如果字符串只是空格或不包含空格会发生什么。我会在下面进行,因为我自己需要它,但似乎没有一个答案能真正回答你。 【参考方案1】:

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

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

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

有点迂腐的更新: 虽然是supported in effectively all browsers 以及 Node.js、deno 等,但 String.prototype.substr() 从未被规范地添加到 ECMAScript 规范中。实际上,这不太可能影响您。但是,如果它困扰您(或者如果您在某些资源受限的环境中运行,由于某种原因没有String.prototype.substr()),您可以使用人们在这个问题上提供的许多其他很好的答案之一。 String.prototype.slice() 是一个很好的替代品,但要注意如果 indexOf()slice() 的第二个参数返回 -1 会产生怪异。 (它会截断字符串的最后一个字符。)就我个人而言,我喜欢@georg 答案末尾的正则表达式lookbehind 解决方案,但这不适用于非常旧的浏览器,因此请注意这一点。

【讨论】:

问题是关于“空白”而不是空格,所以我不确定为什么会有这么多赞成票? @MitraArdron 人们倾向于支持他们认为有帮助的答案。答案的第一句话提到了这个答案只考虑空格而不考虑其他空白字符的事实。由于原始海报接受了答案,因此他们似乎打算将“空格”表示“空格字符”而不是“任何空格字符”。话虽如此,发布答案(或编辑以添加到现有答案)以解释所有空白是一件富有成效且受欢迎的事情。【参考方案2】:

javascript 不支持lookbehinds,所以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) 不适用于没有空格的字符串【参考方案3】:

在 ES6 中你也可以

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

【讨论】:

我非常喜欢这个,它工作得很好,但在性能方面,它对于最受好评的“子字符串”解决方案来说非常糟糕。刚刚对其进行了测试,它的速度大约慢了 10 倍。 它没有回答指定“空白”而不是空格的问题。【参考方案4】:

我知道游戏已经很晚了,但似乎有一种非常简单的方法可以做到这一点:

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

【讨论】:

请注意,这会产生最后一个空白元素。【参考方案5】:
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"];

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

【讨论】:

【参考方案6】:

georg 的解决方案很好,但如果字符串不包含任何空格,则会中断。如果您的字符串有可能不包含空格,则使用 .split 并像这样捕获组会更安全:

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

【讨论】:

【参考方案7】:

您也可以使用 .replace 仅替换第一个匹配项,

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

省略 /g。

DEMO

【讨论】:

@DannyHerran .. 不会吧?你甚至测试过代码吗?没有 /g 修饰符。它不是全球性的。 Try testing the code before you purport to know what it does。在三大浏览器中也进行了测试。我想知道你为什么这么想。 这很聪明,因为我一直认为这是一个缺陷。这是我第一次看到这被利用了:)【参考方案8】:

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

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

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

// As array
const components = 'Surma'.split(/\s+(.*)/);
console.log(components);

【讨论】:

这个问题问的是“空白”而不是空格,并希望以数组形式回答... @MitraArdron:好点,我已经更新了答案。谢谢! 我认为我的答案中的trim 是必需的,但是您的答案和我的答案都不能正确处理包含\n 的字符串。 @georg 的。【参考方案9】:

另一种简单的方法:

str = 'text1 text2 text3';
strFirstWord = str.split(' ')[0];
strOtherWords = str.replace(strFirstWord + ' ', '');

结果:

strFirstWord = 'text1';
strOtherWords = 'text2 text3';

【讨论】:

【参考方案10】:

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

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

【讨论】:

这样!有“缺点”吗?【参考方案11】:

每当我需要从类列表或类名或 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 

我确信它可以压缩成更少的行,但为了便于阅读,我将其扩展。

【讨论】:

【参考方案12】:

我需要一个稍微不同的结果。

我想要第一个单词,以及它之后的内容——即使它是空白的。

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

【讨论】:

【参考方案13】:

上面的大多数答案都是按空格而不是空格搜索的。 @georg 的回答很好。我有一个稍微不同的版本。

s.trim().split(/\s(.*)/).splice(0,2)

我不确定如何判断哪个最有效,因为我的正则表达式要简单得多,但它有多余的空间。

(@georg 的参考是s.split(/(?&lt;=^\S+)\s/)

该问题没有说明如何处理无空格或所有空格、前导或尾随空格或空字符串,在这些情况下我们的结果略有不同。

我正在为需要使用下一个单词的解析器编写此代码,因此我更喜欢我的定义,尽管 @georg 可能更适合其他用例。

input.        mine              @georg
'aaa bbb'     ['aaa','bbb']     ['aaa','bbb']
'aaa bbb ccc' ['aaa','bbb ccc'] ['aaa','bbb ccc']
'aaa '        [ 'aaa' ]         [ 'aaa', '' ]
' '           [ '' ]            [ ' ' ]
''            ['']              ['']
' aaa'        ['aaa']           [' aaa']

【讨论】:

我认为我应该撤回这个答案以支持@georg's - 我仍然认为这个答案对于空格分隔的字符串会更有效,但它不处理带有 \n 的字符串。 【参考方案14】:

我已经使用.split(" ")[0] 来获取空格前的所有字符。

productName.split(" ")[0]

【讨论】:

空格之后的第二部分呢? 应该是[1]【参考方案15】:

以下函数将总是句子分成 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;

【讨论】:

这是way too complicated。

以上是关于在第一个空格出现时拆分字符串的主要内容,如果未能解决你的问题,请参考以下文章

2021-10-15:单词拆分。给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。说明:拆分时可以重复使用字典中的单词。你

R 使用 tidyr::separate 在最后一个空格字符处拆分字符串

将字符串拆分为空白列表,当下一个字符不是破折号时不包括单个空格

php preg_split 最后出现的字符

Python - 如何在拆分字符串时忽略双引号中的空格? [复制]

根据空格拆分字符串并在 angular2 中读取