ใช้ String.split () กับตัวคั่นหลายตัว


201

ฉันต้องการที่จะแยกฐานสตริงคั่นและ- .ด้านล่างเป็นผลลัพธ์ที่ฉันต้องการ

AA.BB-CC-DD.zip ->

AA
BB
CC
DD
zip 

แต่รหัสต่อไปนี้ใช้ไม่ได้

private void getId(String pdfName){
    String[]tokens = pdfName.split("-\\.");
}

จากสิ่งที่คุณพูดดูเหมือนว่าจะทำงานได้ดี ผลลัพธ์ที่คุณต้องการคืออะไร?
Jeff

2
@Jeff: เขาแสดงผลลัพธ์ที่ต้องการ ( AA/ BB/ CC... )
TJ Crowder

2
คุณแน่ใจไหม? ฉันตีความว่าเป็นเอาต์พุตปัจจุบันของเขาไม่ใช่เอาต์พุตที่ต้องการของเขา อาจถึงเวลาลุกขึ้นยืนแล้วเดินไปรอบ ๆ
Jeff

@Jeff: ขออภัยในความสับสนฉันได้อัปเดตโพสต์ของฉันเพื่อล้างความเข้าใจผิดของคุณ
Tham Pham

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

คำตอบ:


311

ฉันคิดว่าคุณต้องรวมตัวดำเนินการ regex หรือ :

String[]tokens = pdfName.split("-|\\.");

สิ่งที่คุณจะต้องจับคู่:
[DASH ตามด้วย DOT ด้วยกัน] -.
ไม่ใช่
[DASH หรือ DOT ใด ๆ ของพวกเขา] -หรือ.


9
ทำไมเราต้องมีแบ็กสแลชสองอัน ??
pjain

7
.ตัวละครใน regex หมายถึงตัวละครอื่น ๆ กว่าบรรทัดใหม่ใด ๆ tutorialspoint.com/java/java_regular_expressions.htmในกรณีนี้ .แต่พวกเขาต้องการตัวละครที่เกิดขึ้นจริง .ทั้งสองเครื่องหมายแสดงให้เห็นว่าคุณหมายถึง แบ็กสแลชเป็นตัวหนี
Monkeygrinder

2
สำหรับกรณีปกติมันจะเป็น.split("match1|match2")(เช่น. split("https|http")\\ คือการหลบหนีถ่านพิเศษ) .ในกรณีดังกล่าวข้างต้น
prayagupd

หรือโดยทั่วไปคุณสามารถใช้pdfName.split("\\W");คำตอบด้านล่าง @Peter Knego
ahmednabil88

1
ใช้[-.]แทน-|\\.
Saeed

49

ลอง regex "[-.]+"นี้ เครื่องหมาย + หลังจากถือว่าตัวคั่นต่อเนื่องเป็นหนึ่งเดียว ลบเครื่องหมายบวกถ้าคุณไม่ต้องการสิ่งนี้


8
@Lurkers: เหตุผลเดียวที่ปีเตอร์ไม่ต้องหลบหนีนั่น-คือมันเป็นความคิดแรกที่เข้า[]มามิฉะนั้นจะต้องมีแบ็กสแลชต่อหน้า (และแน่นอนว่าต้องใส่แบ็กสแลชต่อหน้าเรา) ต้องการสองเพราะเป็นสตริงตัวอักษร)
TJ Crowder

ฉันคิดว่าคำตอบนี้ดีกว่าคำตอบที่ยอมรับได้เพราะเมื่อคุณใช้ตัวดำเนินการเชิงตรรกะ | ปัญหาคือว่าหนึ่งในตัวคั่นของคุณสามารถเป็นส่วนหนึ่งของผลลัพธ์ 'โทเค็น' ของคุณ สิ่งนี้จะไม่เกิดขึ้นกับ [-.] ของ Peter Knego +
Jack '

26

คุณสามารถใช้ regex "\ W" ซึ่งตรงกับอักขระที่ไม่ใช่คำใด ๆ บรรทัดที่ต้องการจะเป็น:

String[] tokens=pdfName.split("\\W");

มันไม่ทำงานสำหรับฉัน `String s =" id (INT), ชื่อ (STRING), " การใช้ \\ W ที่นี่สร้างอาร์เรย์ของความยาว 6 ซึ่งควรเป็นเพียง 4
user3527975

2
สิ่งนี้จะแตกเมื่ออินพุตมีอักขระ Unicode มันเป็นเรื่องที่ดีที่สุดที่จะรวมเฉพาะคั่นจริงแทนที่จะเป็น "คว้าทั้งหมด" \Wกับ
nhahtdh

13

สตริงที่คุณให้splitคือรูปแบบสตริงของนิพจน์ทั่วไปดังนั้น:

private void getId(String pdfName){
    String[]tokens = pdfName.split("[\\-.]");
}

นั่นหมายถึงการแยกตัวละครใด ๆ ใน[](เราต้องหลบหนี-ด้วยแบ็กสแลชเพราะมันอยู่ข้างในพิเศษ[]และแน่นอนว่าเราต้องหนีแบ็กสแลชเพราะนี่คือสตริง) (ตรงกันข้าม.ปกติเป็นพิเศษ แต่ไม่พิเศษภายใน[])


คุณไม่จำเป็นต้องหลบเครื่องหมายยัติภังค์ในกรณีนี้เพราะ[-.]ไม่สามารถตีความได้ว่าเป็นช่วง
Alan Moore

1
@ อลัน: เพราะมันเป็นสิ่งแรกในชั้นเรียนที่ค่อนข้างจริง แต่ฉันมักจะทำมันง่ายเกินไปที่จะย้อนกลับไปในภายหลังและเพิ่มบางสิ่งไว้ข้างหน้าโดยไม่ต้องคิด การหลบหนีมันไม่มีค่าใช้จ่ายดังนั้น ...
TJ Crowder

คุณรู้วิธีที่จะหลบหนีวงเล็บ? ฉันมีสตริง "[200] วิศวกรรม" ที่ฉันต้องการแยกเป็น "200", "วิศวกรรม"
scottysseus

3
โอ้ว้าวฉันเข้าใจแล้ว ... ฉันต้องใช้แบ็กสแลชสองอันแทนอันเดียว String[] strings = codes.get(x).split("\\[|\\]| ");<- รหัสสำหรับทุกคนที่สนใจ
scottysseus


5

สำหรับลำดับถ่านสองตัวเป็นตัวคั่น "AND" และ "OR" สิ่งนี้ควรใช้งานได้ อย่าลืมตัดแต่งขณะใช้งาน

 String text ="ISTANBUL AND NEW YORK AND PARIS OR TOKYO AND MOSCOW";
 String[] cities = text.split("AND|OR"); 

ผลลัพธ์: เมือง = {"ISTANBUL", "นิวยอร์ก", "ปารีส", "โตเกียว", "มอสโกว์"}


ฉันจะได้รับผลลัพธ์เช่น {"อิสตันบูลและ", "นิวยอร์กและ", "ปารีสหรือ", "โตเกียวและ", "มอสโก"}
Ahamadullah Saikat

3

ฉันจะใช้ Apache Commons:

นำเข้า org.apache.commons.lang3.StringUtils;

private void getId(String pdfName){
    String[] tokens = StringUtils.split(pdfName, "-.");
}

มันจะแยกกับตัวคั่นที่ระบุใด ๆ ซึ่งตรงข้ามกับStringUtils.splitByWholeSeparator(str, separator)ที่ใช้สตริงที่สมบูรณ์เป็นตัวคั่น


3
String[] token=s.split("[.-]");

10
โปรดช่วยต่อสู้กับความเข้าใจผิดที่ StackOverflow เป็นบริการเขียนโค้ดฟรีโดยเพิ่มคำตอบเฉพาะโค้ดของคุณพร้อมคำอธิบายบางอย่าง
Yunnosch

2

จะดีกว่าที่จะใช้สิ่งนี้:

s.split("[\\s\\-\\.\\'\\?\\,\\_\\@]+");

เพิ่มตัวอย่างอื่น ๆ สองสามตัวอย่าง นี่เป็นวิธีที่ปลอดภัยที่สุดที่จะใช้เพราะวิธีการ.และ'ได้รับการปฏิบัติ


1

คุณอาจระบุนิพจน์ทั่วไปเป็นอาร์กิวเมนต์ใน split () method .. ดูตัวอย่างด้านล่าง ...

private void getId(String pdfName){
String[]tokens = pdfName.split("-|\\.");
}

1

ลองรหัสนี้:

var string = 'AA.BB-CC-DD.zip';
array = string.split(/[,.]/);

2
โปรดช่วยต่อสู้กับความเข้าใจผิดที่ StackOverflow เป็นบริการเขียนโค้ดฟรีโดยเพิ่มคำตอบเฉพาะโค้ดของคุณพร้อมคำอธิบายบางอย่าง
Yunnosch

0
s.trim().split("[\\W]+") 

ควรทำงาน.


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

1
โปรดช่วยต่อสู้กับความเข้าใจผิดที่ StackOverflow เป็นบริการเขียนโค้ดฟรีโดยเพิ่มคำตอบเฉพาะโค้ดของคุณพร้อมคำอธิบายบางอย่าง
Yunnosch

-1

หากคุณรู้ว่า sting นั้นจะอยู่ในรูปแบบเดียวกันเสมอก่อนอื่นให้แยกสตริงตาม.และเก็บสตริงที่ดัชนีแรกในตัวแปร จากนั้นแบ่งสตริงในดัชนีที่สองตาม-และจัดเก็บดัชนี 0, 1 และ 2 ในที่สุดแยกดัชนี 2 ของอาร์เรย์ก่อนหน้าตาม.และคุณควรได้รับฟิลด์ที่เกี่ยวข้องทั้งหมด

อ้างถึงตัวอย่างข้อมูลต่อไปนี้:

String[] tmp = pdfName.split(".");
String val1 = tmp[0];
tmp = tmp[1].split("-");
String val2 = tmp[0];
...

6
สามารถทำได้ในขั้นตอนเดียวจึงทำได้ในขั้นตอนเดียว ดูคำตอบอื่น ๆ
Kaj

2
pdfName.split(".")ผลลัพธ์ในอาร์เรย์ที่มีความยาวเป็นศูนย์
Alan Moore

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