วิธีการแยกสตริงด้วยช่องว่างใด ๆ เป็นตัวคั่น


555

อะไรรูปแบบ regex ฉันจะต้องส่งผ่านไปยัง java.lang.String.split() แยกสตริงเป็น array ของสตริงโดยใช้ตัวอักษรทั้งหมดช่องว่าง (เป็น' ', '\t', '\n'ฯลฯ ) เป็นตัวคั่น?

คำตอบ:


955

บางสิ่งบางอย่างในสายของ

myString.split("\\s+");

กลุ่มนี้มีช่องว่างสีขาวทั้งหมดเป็นตัวคั่น

ดังนั้นถ้าฉันมีสตริง:

"Hello[space][tab]World"

นี้ควรผลผลิตสตริง"Hello"และ"World"และงดช่องว่างระหว่างและ[space][tab]

ในฐานะที่เป็น VonC ชี้ให้เห็นเครื่องหมายควรจะหนีเพราะ Java แรกจะพยายามที่จะหลบหนีสตริงอักขระพิเศษและส่งที่สามารถแยกวิเคราะห์ สิ่งที่คุณต้องการคือที่แท้จริงซึ่งหมายความว่าคุณจะต้องผ่าน"\s" "\\s"มันอาจทำให้สับสนเล็กน้อย

เทียบเท่ากับ\\s[ \\t\\n\\x0B\\f\\r]


1
ขอบคุณสำหรับคำเตือนนั้น ฉันเพิ่งเขียนโค้ดจากสะโพก :)
Henrik Paul

34
โปรดทราบว่าคุณต้องtrim()ก่อน: trim().split("\\s++")- มิฉะนั้นเช่นแยก `abc 'จะปล่อยสองสตริงว่างก่อน
Marcus Junius Brutus

ทำไมคุณใช้แบ็กสแลชสี่อันใกล้ถึงจุดสิ้นสุดของคำตอบ กล่าวคือ "\\\\s"?
Michael Borkowski

"" .trim (). split ("\\ s +") - การแยกสตริงว่างให้ความยาว 1 "คำว่า" .trim (). split ("\\ s +") - ให้ความยาว 1 .
PaulSchell

88

ในภาษาถิ่น regex ส่วนใหญ่มีชุดบทสรุปตัวละครที่สะดวกสบายที่คุณสามารถใช้สำหรับสิ่งนี้ - นี่คือสิ่งที่ดีที่ต้องจำ:

\w - จับคู่อักขระคำใด ๆ

\W - ตรงกับตัวละครที่ไม่ใช่คำพูดใด ๆ

\s - จับคู่อักขระเว้นวรรคใด ๆ

\S - จับคู่อะไรก็ได้ยกเว้นอักขระเว้นวรรค

\d - ตรงกับตัวเลขใด ๆ

\D - จับคู่อะไรก็ได้ยกเว้นตัวเลข

การค้นหา "Regex Cheatsheets" ควรตอบแทนคุณด้วยบทสรุปที่เป็นประโยชน์มากมาย


2
ลิงค์ที่มีประโยชน์: docs.oracle.com/javase/1.4.2/docs/api/java/util/regex/ ......
Michaël

อ่านคลาสรูปแบบ JavaDoc: docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html
Christophe Roussy

64

ในการทำให้Javascriptทำงานฉันต้องทำสิ่งต่อไปนี้:

myString.split(/\s+/g)

15
นี่คือใน Javascript ฉันไม่ได้สนใจเหมือนกัน :)
miracle2k

14
อุ่ย ความผิดพลาดของฉัน. บางทีคำตอบนี้อาจช่วยผู้อื่นที่สะดุดหัวข้อนี้ขณะที่ค้นหาคำตอบ Javascript :-)
Mike Manard

ฮ่าฮ่าฉันกำลังหาคำตอบสำหรับ JavaScript บังเอิญเจอคำถามนี้แล้วสังเกตคำตอบของคุณก่อนที่ฉันจะจากไป +1
กริช

เยี่ยมมาก! ฉันดีใจที่ได้ยินคำตอบนี้พิสูจน์แล้วว่ามีประโยชน์สำหรับใครบางคนถึงแม้ว่ามันจะตอบคำถามที่ผิดก็ตาม :-)
Mike Manard

นี้ช่วยให้ฉันมากเช่นกันที่จำเป็นในการ args เซิร์ฟเวอร์แยก :)
ProgrammerPlays

36

"\\ s +" ควรทำเคล็ดลับ


1
ทำไมเครื่องหมาย + ในตอนท้าย
Floella

4
@Anarelle มันซ้ำตัวละครจับพื้นที่อย่างน้อยหนึ่งครั้งและเป็นเวลามากที่สุด: ดูhttps://regex101.com/r/dT7wG9/1หรือhttp://rick.measham.id.au/paste/explain pl? regex = \ s% 2Bหรือhttp://regexper.com/#^s%2Bหรือhttp://www.myezapp.com/apps/dev/regexp/show.ws?regex=\s+&env= env_java
VonC

11

นอกจากนี้คุณอาจมี UniCode ที่ไม่ทำลายพื้นที่ xA0 ...

String[] elements = s.split("[\\s\\xA0]+"); //include uniCode non-breaking

สิ่งนี้ช่วยฉัน!
Surasin Tancharoen



2

เนื่องจากเป็นนิพจน์ทั่วไปและฉันถือว่าคุณไม่ต้องการอักขระที่ไม่ใช่ตัวอักษรและตัวเลขเช่นเครื่องหมายจุลภาคจุด ฯลฯ ที่สามารถล้อมรอบด้วยช่องว่าง (เช่น "หนึ่งสอง" ควรให้ [หนึ่ง] [สอง]) มันควรจะเป็น:

myString.split(/[\s\W]+/)

1

คุณสามารถแยกสตริงตามตัวแบ่งบรรทัดโดยใช้คำสั่งต่อไปนี้:

 String textStr[] = yourString.split("\\r?\\n");

คุณสามารถแยกสตริงด้วย Whitespace โดยใช้คำสั่งต่อไปนี้:

String textStr[] = yourString.split("\\s+");


-1

ศึกษารหัสนี้ .. ขอให้โชคดี

    import java.util.*;
class Demo{
    public static void main(String args[]){
        Scanner input = new Scanner(System.in);
        System.out.print("Input String : ");
        String s1 = input.nextLine();   
        String[] tokens = s1.split("[\\s\\xA0]+");      
        System.out.println(tokens.length);      
        for(String s : tokens){
            System.out.println(s);

        } 
    }
}

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