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

时间:2012-04-22 22:42:52

标签: javascript regex

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

var str="72 tocirah sneab";

我需要得到:

[
    "72",
    "tocirah sneab",
]

15 个答案:

答案 0 :(得分:282)

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

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

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

答案 1 :(得分:42)

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)

答案 2 :(得分:24)

在ES6中你也可以

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

答案 3 :(得分: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"];

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

答案 4 :(得分:13)

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

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

这将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 :(得分: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

答案 6 :(得分:9)

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

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

退出/ g。

DEMO

答案 7 :(得分:3)

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

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

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

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

答案 8 :(得分:2)

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

select * from 
(
    select 11 as COMP_NO
    union
    select 12
    union
    select 13
    union
    select 14
    union
    select 15
) A

或者,如果你想从字符串直接挑选你需要的东西,你可以这样做:

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"

但是我建议第一个例子。

工作演示:jsbin

答案 9 :(得分:0)

每当我需要从类列表或类名或id的一部分中获取类时,我总是使用split()然后使用数组索引专门获取它,或者通常在我的情况下使用pop( )获取最后一个元素或shift()以获得第一个元素。

这个例子得到了div的类&#34; gallery_148 ui-sortable&#34; 并返回图库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 

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

答案 10 :(得分: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

答案 11 :(得分:0)

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

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

我不确定如何确定哪种方法最有效,因为我的正则表达式要简单得多,但它具有额外的位置。

(@ georg供参考的是s.split(/(?<=^\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']

答案 12 :(得分:0)

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

productName.split(" ")[0]

答案 13 :(得分:0)

另一种简单的方法:

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

结果:

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

答案 14 :(得分:-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;
}