แยกสตริงในพื้นที่สีขาวแรกที่เกิดขึ้น


150

ฉันไม่ได้รับ regex ที่ดีที่สุดที่แบ่ง String ให้ฉันตามการเกิดพื้นที่สีขาวแรก:

var str="72 tocirah sneab";

ฉันต้องไปเอา:

[
    "72",
    "tocirah sneab",
]

1
คุณหมายถึงอะไรโดย "ปรับให้เหมาะสม"? มันมีจะเป็น regex?
Deestan

โปรดสละเวลาเพื่อเลื่อนลงไปที่คำตอบของ @ georg - beautiful stackoverflow.com/a/10272828/93910
Sanjay Manohar

คำตอบ:


324

หากคุณสนใจเฉพาะอักขระช่องว่าง (และไม่ใช่แท็บหรืออักขระช่องว่างอื่น ๆ ) และสนใจเฉพาะทุกอย่างก่อนเว้นวรรคแรกและทุกอย่างหลังจากเว้นวรรคแรกคุณสามารถทำได้โดยไม่ต้องใช้นิพจน์ทั่วไปดังนี้

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

โปรดทราบว่าหากไม่มีที่ว่างเลยบรรทัดแรกจะส่งคืนสตริงว่างและบรรทัดที่สองจะส่งคืนสตริงทั้งหมด ตรวจสอบให้แน่ใจว่าเป็นพฤติกรรมที่คุณต้องการในสถานการณ์นั้น (หรือว่าสถานการณ์นั้นจะไม่เกิดขึ้น)


50

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) จะไม่ทำงานกับสตริงที่ไม่มีที่ว่าง
Junaid

30

ใน ES6 คุณยังสามารถ

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

2
ฉันชอบสิ่งนี้เล็กน้อยและใช้งานได้ดี แต่ประสิทธิภาพก็ไม่ดีนักสำหรับโซลูชัน "substring" ที่ upvoted ที่สุด เพิ่งทดสอบและช้าลงประมาณ 10 เท่า
pootzko

19

มาถึงช่วงท้ายของเกมฉันรู้ แต่ดูเหมือนจะมีวิธีที่ง่ายมากในการทำสิ่งนี้:

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 นั้นดี แต่ถ้าสตริงไม่มีช่องว่าง หากสตริงของคุณมีโอกาสที่จะไม่มีช่องว่างมันจะปลอดภัยกว่าหากใช้. แยกและจับภาพกลุ่มเช่น:

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

9

นอกจากนี้คุณยังสามารถใช้. แทนที่เพื่อแทนที่เหตุการณ์แรกเท่านั้น

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

ออกจาก / g

การสาธิต


3
@DannyHerran .. ไม่หรอกเหรอ? คุณได้ทดสอบรหัสแล้วหรือยัง? ไม่มีตัวแก้ไข / g มันไม่ได้เป็นสากล ลองทดสอบรหัสก่อนที่คุณจะรู้ว่ามันทำอะไร ทดสอบในสามเบราว์เซอร์ที่สำคัญเช่นกัน ฉันต้องการที่จะรู้ว่าทำไมคุณคิดว่าสิ่งที่คุณทำ
Daedalus

มันฉลาดเพราะฉันคิดว่านี่เป็นข้อบกพร่องเสมอ ครั้งนี้เป็นครั้งแรกที่ผมเห็นนี้จะนำประโยชน์จาก :)
โกกอล

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

นี้เป็นวิธีที่ซับซ้อนเกินไป
Dan Dascalescu
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.