การแยกสตริง Java ด้วยสัญลักษณ์ไปป์โดยใช้ split (“ |”)


195

เอกสารประกอบอย่างเป็นทางการของ Java:

"boo:and:foo"ตัวอย่างเช่นสตริงให้ผลลัพธ์ต่อไปนี้ด้วยนิพจน์ผลลัพธ์ Regex เหล่านี้:

{ "boo", "and", "foo" }"

และนั่นคือวิธีที่ฉันต้องการในการทำงาน อย่างไรก็ตามถ้าฉันเรียกใช้สิ่งนี้:

public static void main(String[] args){
        String test = "A|B|C||D";

        String[] result = test.split("|");

        for(String s : result){
            System.out.println(">"+s+"<");
        }
    }

มันพิมพ์:

><
>A<
>|<
>B<
>|<
>C<
>|<
>|<
>D<

ซึ่งอยู่ไกลจากสิ่งที่ฉันคาดหวัง:

>A<
>B<
>C<
><
>D<

ทำไมสิ่งนี้จึงเกิดขึ้น


2
ซ้ำกันเป็นไปได้ของวิธีการแยกสตริงใน Java
KIBOU Hassan

คำตอบ:


424

คุณต้องการ

test.split("\\|");

splitใช้การแสดงออกปกติและในregex |เป็นตัวอักษรแทนORผู้ประกอบการ คุณต้องหลบหนีจากตัวละครที่ใช้\(เขียนใน String "\\"เนื่องจาก\เป็น metacharacter ในตัวอักษร String และต้องการให้ตัวอื่น\หลบหนี)

คุณยังสามารถใช้

test.split(Pattern.quote("|"));

และปล่อยให้Pattern.quoteสร้างรุ่นหนีของ regex |ที่เป็นตัวแทนของ


17
มันเป็นsplit()วิธีการที่ใช้เวลา regex และ|เป็นตัวละครพิเศษสำหรับ reg อดีต
Jigar Joshi

1
คุณเป็นตัวเลือกที่สองของฉันในฐานะผู้ดูแลในสแต็กล้น ทั้งหมดที่ดีที่สุด
DäñishShärmà

33

ใช้การหลบหนีที่เหมาะสม: string.split("\\|")

หรือใน Java 5+ ให้ใช้ตัวช่วยPattern.quote()ที่ถูกสร้างขึ้นเพื่อจุดประสงค์นี้:

string.split(Pattern.quote("|"))

ซึ่งทำงานกับสตริงอินพุตที่กำหนดเอง มีประโยชน์มากเมื่อคุณต้องการอ้าง / ป้อนข้อมูลผู้ใช้หลบหนี


3
ไม่ shure เมื่อการเปลี่ยนแปลงที่ถูกสร้างขึ้น แต่ใน Java 8 Pattern.quote()หนึ่งจะใช้
RAnders00

4

ใช้รหัสนี้:

public static void main(String[] args) {
    String test = "A|B|C||D";

    String[] result = test.split("\\|");

    for (String s : result) {
        System.out.println(">" + s + "<");
    }
}

โซลูชันนี้ชี้ไปแล้วโดยคำตอบที่ยอมรับแล้ว ไม่จำเป็นต้องทำซ้ำ
Pshemo


1

.split("[|]")นอกจากนี้คุณยังสามารถใช้

(ฉันใช้สิ่งนี้แทน.split("\\|")ซึ่งไม่ได้ผลสำหรับฉัน)


ทั้งสองเวอร์ชันควรทำงานได้ดี หากไม่มีใครแนะนำว่าปัญหาอยู่ที่อื่น
Pshemo

@Pshemo สิ่งนี้จะเพิ่มรสชาติที่น่าสนใจซึ่งสัญลักษณ์ที่สงวนไว้บางส่วนไม่จำเป็นต้องหลบหนีหากใส่ไว้ในวงเล็บ
สันติภาพ Vobiscum

0
test.split("\\|",999);

การระบุขีด จำกัดหรือสูงสุดจะแม่นยำสำหรับตัวอย่างเช่น: "boo ||| a" หรือ "|" boo | " หรือ "|||"

แต่ test.split("\\|");จะส่งคืนอาร์เรย์ความยาวต่างกันสำหรับตัวอย่างเดียวกัน

ใช้การอ้างอิง: ลิงค์


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