ใน java วิธีรับสตริงย่อยจากสตริงจนถึงอักขระ c?


105

ฉันมีสตริง (ซึ่งโดยพื้นฐานแล้วจะเป็นชื่อไฟล์ตามหลักการตั้งชื่อ) abc.def.ghi

ฉันต้องการแยกสตริงย่อยก่อนอันแรก.(เช่นจุด)

ใน java doc api ดูเหมือนว่าฉันจะไม่พบวิธีการใน String ที่ทำเช่นนั้นได้
ฉันพลาดอะไรไปรึเปล่า? ทำอย่างไร?

คำตอบ:


66

ดูและ String.indexOfString.substring

ให้แน่ใจว่าคุณตรวจสอบ indexOf-1


1
สั้นและหวาน โปรดจำไว้ว่า indexOf ให้ดัชนีแรกของสตริงย่อย
Neil Chowdhury

อย่างที่ @ Sam B พูดคุณไม่ได้อธิบายวิธีการใช้งาน
IntelliData

115

คำตอบที่ยอมรับนั้นถูกต้อง แต่ไม่ได้บอกวิธีใช้ นี่คือวิธีที่คุณใช้ฟังก์ชัน indexOf และสตริงย่อยร่วมกัน

String filename = "abc.def.ghi";     // full file name
int iend = filename.indexOf("."); //this finds the first occurrence of "." 
//in string thus giving you the index of where it is in the string

// Now iend can be -1, if lets say the string had no "." at all in it i.e. no "." is found. 
//So check and account for it.

String subString;
if (iend != -1) 
{
    subString= filename.substring(0 , iend); //this will give abc
}

1
รหัสนี้ไม่ถูกต้องเนื่องจากคุณไม่สามารถใส่การประกาศตัวแปรในเนื้อความของคำสั่ง If โดยไม่มีเครื่องหมายวงเล็บ
Clashsoft

@Clashoft จัดฟันโดยนัยที่นี่
Alioo

89

คุณสามารถแยกสตริง ..

public String[] split(String regex)

โปรดสังเกตว่า java.lang.String.split ใช้ค่านิพจน์ทั่วไปของตัวคั่น โดยทั่วไปเป็นเช่นนี้ ...

String filename = "abc.def.ghi";     // full file name
String[] parts = filename.split("\\."); // String array, each element is text between dots

String beforeFirstDot = parts[0];    // Text before the first dot

แน่นอนว่านี่แบ่งออกเป็นหลายบรรทัดเพื่อความมีตาทิพย์ มันสามารถเขียนเป็น

String beforeFirstDot = filename.split("\\.")[0];

5
ข้อเสนอของคุณไม่ถูกต้องเนื่องจาก java.lang.String.split ใช้ค่า regex เป็นแอตทริบิวต์ไม่ใช่แค่สตริง ทั้งหมด "." ในตัวอย่างของคุณต้องเปลี่ยนเป็น "\\." แล้วมันจะทำงาน :)
Erik Kaju

2
ฉันรัก regex แต่นั่นทำให้ฉันรู้สึกทุกครั้ง
Chad Schouggins

75

หากโครงการของคุณใช้commons-lang อยู่แล้ว StringUtils มีวิธีการที่ดีสำหรับจุดประสงค์นี้:

String filename = "abc.def.ghi";

String start = StringUtils.substringBefore(filename, "."); // returns "abc"

ดู javadoc [2.6] [3.1]


สะอาดกว่าโซลูชันอื่น ๆ
userab

12

หรือคุณอาจลองทำสิ่งต่างๆเช่น

"abc.def.ghi".substring(0,"abc.def.ghi".indexOf(c)-1);


3
จะผิดพลาดของ 'c' ไม่อยู่ในสตริงเนื่องจาก indexOf จะกลับมา -1
TofuBeer

@Umer Hayat ถ้าชื่อไฟล์คือdef.hij.klmอะไร? โค้ดของคุณจะทำงานอย่างไร? (โค้ดของคุณใช้ได้กับตัวอย่างนี้เท่านั้น - คุณอาจเขียนฟังก์ชันที่ส่งคืน"abc"- มันก็ใช้ได้เช่นกัน)
โบฮีเมียน

@ โบฮีเมียน: ฉันรู้ว่ามีกรณีและการตรวจสอบที่ขาดหายไป เป็นคำตอบที่เฉพาะเจาะจงสำหรับคำถามและแนวคิดเฉพาะคือการให้แนวคิดทั่วไปผ่านตัวอย่าง :)
Umer Hayat

1
@TofuBeer: โอเคดีมีความสับสนก่อนหน้านี้ "(คือจุด)" ไม่มีในโพสต์จริง ฉันคิดว่าและหวังว่าคำตอบของฉันจะให้แนวคิดทั่วไปในการแก้ปัญหากลุ่มนี้
Umer Hayat

2
ฉันจะไปกับ: int ix = inString.indexOf ('.'); ถ้า (ix> -1) inString = inString.substring (0, ix); ฉันไม่รู้ว่าทำไม Umer จึงแนะนำให้ลบ 1 อาร์กิวเมนต์ที่สองของสตริงย่อยขึ้นอยู่กับ แต่ไม่รวมอยู่ดี
Micha Berger

4

วิธีการใช้ regex

String firstWord = filename.replaceAll("\\..*","")

สิ่งนี้จะแทนที่ทุกอย่างตั้งแต่จุดแรกไปจนถึงจุดสิ้นสุดด้วย "" (กล่าวคือล้างออกทำให้คุณมีสิ่งที่คุณต้องการ)

นี่คือการทดสอบ:

System.out.println("abc.def.hij".replaceAll("\\..*", "");

เอาท์พุต:

abc

7
ฉันไม่ได้ลงคะแนน (และฉันยอมรับว่ามันแย่มากเมื่อมีคนลงคะแนนโดยไม่มีเหตุผล) แต่โซลูชันของคุณค่อนข้างแพงและไม่ชัดเจน
TofuBeer

1
@ Knickerless-Noggins ฉันสามารถอธิบายได้หากคุณต้องการข้อมูลเฉพาะฉันก็ทำได้เช่นกัน ... แต่ไม่แน่ใจว่าฉันจะทำอย่างไรในความคิดเห็น (อาจต้องทำคำถาม / คำตอบอื่น) มีราคาแพงเนื่องจากสร้างสตริงใหม่ทั้งหมดพร้อมกับอักขระที่แทนที่ทั้งหมด สตริงย่อยเพียงส่งคืนมุมมองลงในสตริง ที่ช่วย?
TofuBeer

2
@TofuBeer คุณพูดไม่ถูก สตริงไม่เปลี่ยนรูป สตริงย่อยไม่ส่งคืนมุมมอง ทุก String ที่ส่งคืนจากวิธี String เป็นString ใหม่
โบฮีเมียน

@ Knickerless-Noggins เขาเข้าใจผิด ... ดูความคิดเห็นล่าสุด นอกจากนี้ยังมีประสิทธิภาพเพียงพอ ความหนาแน่นของโค้ดสูง - จะต้องใช้อย่างเข้มข้นเพื่อปรับให้เหมาะสมกับการเพิ่มโค้ดเพื่อประโยชน์ในด้าน "ประสิทธิภาพ"
โบฮีเมียน

เห็นได้ชัดว่าเปลี่ยนไปใน JDK 7, javarevisited.blogspot.ca/2011/10/…
TofuBeer

2

ใน java.lang.String คุณจะได้รับวิธีการบางอย่างเช่น indexOf (): ซึ่งจะส่งคืนดัชนีแรกของถ่าน / สตริง และ lstIndexOf: ซึ่งส่งคืนดัชนีสุดท้ายของ String / char

จาก Java Doc:

  public int indexOf(int ch)
  public int indexOf(String str)

ส่งคืนดัชนีภายในสตริงของการเกิดครั้งแรกของอักขระที่ระบุนี้


2

นี่คือรหัสที่ส่งคืนสตริงย่อยจาก a Stringจนถึงรายการอักขระใด ๆ ที่กำหนด:

/**
 * Return a substring of the given original string until the first appearance
 * of any of the given characters.
 * <p>
 * e.g. Original "ab&cd-ef&gh"
 * 1. Separators {'&', '-'}
 * Result: "ab"
 * 2. Separators {'~', '-'}
 * Result: "ab&cd"
 * 3. Separators {'~', '='}
 * Result: "ab&cd-ef&gh"
 *
 * @param original   the original string
 * @param characters the separators until the substring to be considered
 * @return the substring or the original string of no separator exists
 */
public static String substringFirstOf(String original, List<Character> characters) {
    return characters.stream()
            .map(original::indexOf)
            .filter(min -> min > 0)
            .reduce(Integer::min)
            .map(position -> original.substring(0, position))
            .orElse(original);
}

1

สิ่งนี้สามารถช่วยได้:

public static String getCorporateID(String fileName) {

    String corporateId = null;

    try {
        corporateId = fileName.substring(0, fileName.indexOf("_"));
        // System.out.println(new Date() + ": " + "Corporate:
        // "+corporateId);
        return corporateId;
    } catch (Exception e) {
        corporateId = null;
        e.printStackTrace();
    }

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