สตริงการแยกเท่านั้นในอินสแตนซ์แรก - java


145

ฉันต้องการแยกสตริงด้วย '=' charecter แต่ฉันต้องการให้แยกตัวอย่างแรกเท่านั้น ฉันจะทำสิ่งนั้นได้อย่างไร นี่คือตัวอย่าง JavaScript สำหรับ '_' char แต่มันไม่ทำงานสำหรับฉันที่ แยกสตริงในอินสแตนซ์แรกของอักขระที่ระบุเท่านั้น

ตัวอย่าง:

apple=fruit table price=5

เมื่อฉันลอง String.split ('='); มันให้

[apple],[fruit table price],[5]

แต่ฉันต้องการ

[apple],[fruit table price=5]

ขอบคุณ


=คุณไม่จำเป็นที่จะหลบหนี
Rohit Jain

คำตอบ:


282
string.split("=", 2);

ตามที่String.split(java.lang.String regex, int limit)อธิบายไว้:

อาร์เรย์ที่ส่งคืนโดยเมธอดนี้มีแต่ละสตริงย่อยของสตริงนี้ที่ถูกยกเลิกโดยสตริงย่อยอื่นที่ตรงกับนิพจน์ที่กำหนดหรือถูกยกเลิกในตอนท้ายของสตริง สตริงย่อยในอาร์เรย์อยู่ในลำดับที่เกิดขึ้นในสตริงนี้ หากการแสดงออกไม่ตรงกับส่วนใด ๆ ของการป้อนข้อมูลแล้วอาร์เรย์ที่เกิดมีเพียงองค์ประกอบเดียวคือสายนี้

limitพารามิเตอร์ควบคุมจำนวนครั้งรูปแบบถูกนำไปใช้และดังนั้นจึงส่งผลกระทบต่อความยาวของอาร์เรย์ที่เกิด หากขีด จำกัดnมากกว่าศูนย์รูปแบบจะถูกนำมาใช้มากที่สุดn - 1 ครั้งความยาวของอาร์เรย์จะไม่มากกว่าnและรายการสุดท้ายของอาร์เรย์จะมีอินพุตทั้งหมดนอกเหนือจากตัวคั่นที่ตรงกันล่าสุด

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

Regex Limit    Result
:     2        { "boo", "and:foo" }
:     5        { "boo", "and", "foo" }
:    -2        { "boo", "and", "foo" }
o     5        { "b", "", ":and:f", "", "" }
o    -2        { "b", "", ":and:f", "", "" }
o     0        { "b", "", ":and:f" }

1
มันสับสนที่จะเข้าใจ แต่มันก็ใช้งานได้! ขอบคุณ!
Clint Eastwood

4
การชี้แจงบางส่วน: ข้อ จำกัด ที่ 2 จะส่งคืนรายการองค์ประกอบ AT MOST 2 มันอาจส่งคืนรายการของ 1 องค์ประกอบถ้าไม่มีการจับคู่กับนิพจน์ หากมีการจับคู่ 2 กับนิพจน์องค์ประกอบที่สองของอาร์เรย์ที่ส่งคืนจะไม่ถูกแยกออก
mod1313

11

ใช่คุณทำได้เพียงส่งพารามิเตอร์จำนวนเต็มไปยังวิธีการแยก

String stSplit = "apple=fruit table price=5"

stSplit.split("=", 2);

นี่คือเอกสารอ้างอิง java doc: String # split (java.lang.String, int)


5

ดังที่คำตอบอื่น ๆ แนะนำวิธีการ จำกัด ซึ่งอาจเป็นอีกวิธีหนึ่ง

คุณสามารถใช้วิธีการindexOfบน String ซึ่งจะส่งกลับค่าแรกของอักขระที่กำหนดโดยใช้ดัชนีนั้นคุณจะได้ผลลัพธ์ที่ต้องการ

String target = "apple=fruit table price=5" ;
int x= target.indexOf("=");
System.out.println(target.substring(x+1));

2
สิ่งนี้ไม่แยก แต่แยกส่วนที่สอง การใช้ส่วนแรกจะต้องมีรหัสอีกบรรทัดหนึ่ง ... 4 บรรทัดต่อ 1 = thumbs down
Clint Eastwood

0

ลองใช้รหัสนี้ ...

มันทำงาน

public class Split
{
    public static void main(String...args)
    {
        String a = "%abcdef&Ghijk%xyz";
        String b[] = a.split("%", 2);

        System.out.println("Value = "+b[1]);
    }
}

0
String string = "This is test string on web";
String splitData[] = string.split("\\s", 2);

Result ::
splitData[0] =>  This
splitData[1] =>  is test string  


String string = "This is test string on web";
String splitData[] = string.split("\\s", 3);

Result ::
splitData[0] =>  This
splitData[1] =>  is
splitData[1] =>  test string on web

โดยวิธีการแยกเริ่มต้นสร้างจำนวน n ของอาร์เรย์บนพื้นฐานของ regex ที่กำหนด แต่ถ้าคุณต้องการที่จะ จำกัด จำนวนของอาร์เรย์ที่จะสร้างหลังจากการแยกอาร์กิวเมนต์ที่สองผ่านเป็นอาร์กิวเมนต์จำนวนเต็ม


3
ปัญหาคืออะไร? รวมรายละเอียดเพิ่มเติมเพื่อทำให้คำตอบของคุณอธิบายด้วยตนเอง!
Paresh Mayani

-2
String[] func(String apple){
String[] tmp = new String[2];
for(int i=0;i<apple.length;i++){
   if(apple.charAt(i)=='='){
      tmp[0]=apple.substring(0,i);
      tmp[1]=apple.substring(i+1,apple.length);
      break;
   }
}
return tmp;
}
//returns string_ARRAY_!

ฉันชอบเขียนวิธีการของตัวเอง :)


3
วิธีนี้ไม่ได้มีประโยชน์มากนักเนื่องจากตัวแยกถูกฮาร์ดโค้ด นอกจากนี้การใช้การค้นหาเชิงเส้นด้วย for-loop ไม่ได้เปรียบเหนือการใช้ String.indexOf เพื่อค้นหาตำแหน่งของตัวคั่นแรก ประการที่สามไม่ง่ายที่จะดูว่ามีการส่งคืนองค์ประกอบสตริงกี่รายการ ในขณะที่เราพูดถึงการแยกสิ่งต่าง ๆ ออกเป็นสองประเภทให้พิจารณาใช้ชนิดข้อมูล Pair <String, String> ซึ่งแสดงถึงสองสตริงแทนการสร้างอาร์เรย์
Gee Bee
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.