Trong java làm thế nào để lấy chuỗi con từ một chuỗi đến một ký tự c?


100

Tôi có một chuỗi (về cơ bản là tên tệp tuân theo quy ước đặt tên) abc.def.ghi

Tôi muốn trích xuất chuỗi con trước chuỗi đầu tiên .(tức là một dấu chấm)

Trong java doc api, tôi dường như không thể tìm thấy một phương thức nào trong String để thực hiện điều đó.
Tui bỏ lỡ điều gì vậy? Làm thế nào để làm nó?

Câu trả lời:


65

nhìn vào String.indexOfString.substring.

Đảm bảo bạn kiểm tra -1 cho indexOf.


1
ngắn và ngọt. Cũng nên nhớ rằng indexOf cung cấp chỉ mục đầu tiên của chuỗi con.
Neil Chowdhury

111

Câu trả lời được chấp nhận là đúng nhưng nó không cho bạn biết cách sử dụng nó. Đây là cách bạn sử dụng các hàm indexOf và chuỗi con cùng nhau.

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
Đây là mã không hợp lệ vì bạn không thể đặt một khai báo biến trong phần thân của Câu lệnh If mà không có dấu ngoặc nhọn.
Clashsoft

84

Bạn chỉ có thể tách chuỗi ..

public String[] split(String regex)

Lưu ý rằng java.lang.String.split sử dụng giá trị biểu thức chính quy của dấu phân tách. Về cơ bản như thế này ...

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

Tất nhiên, điều này được chia thành nhiều dòng để đòi quyền lợi. Nó có thể được viết là

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

5
Đề xuất của bạn không đúng, vì java.lang.String.split nhận giá trị regex làm thuộc tính, không chỉ là chuỗi. Tất cả "." trong ví dụ của bạn cần được thay đổi thành "\\." Sau đó, nó sẽ làm việc :)
Erik Kaju

2
Tôi thích regex, nhưng điều đó khiến tôi luôn gặp phải.
Chad Schouggins

70

Nếu dự án của bạn đã sử dụng commons-lang , thì StringUtils cung cấp một phương pháp hay cho mục đích này:

String filename = "abc.def.ghi";

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

xem javadoc [2.6] [3.1]


Sạch hơn các giải pháp khác.
userab

12

hoặc bạn có thể thử một cái gì đó như

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


3
sẽ sụp đổ của 'c' không nằm trong chuỗi như indexOf sẽ trở lại -1
TofuBeer

@Umer Hayat Điều gì xảy ra nếu tên tệp là def.hij.klm? Sau đó mã của bạn sẽ hoạt động như thế nào? (Mã của bạn chỉ hoạt động cho một ví dụ này - bạn cũng có thể viết một hàm trả về "abc"- nó cũng sẽ hoạt động tốt)
Bohemian

@Bohemian: Tôi biết có những trường hợp ranh giới và séc bị thiếu. Đó là một câu trả lời cụ thể cho câu hỏi cụ thể và ý tưởng là đưa ra ý tưởng chung thông qua một ví dụ :).
Umer Hayat,

1
@TofuBeer: Được rồi, có một sự nhầm lẫn trước đó "(tức là dấu chấm)" không có trong bài đăng thực tế. Tôi nghĩ và hy vọng câu trả lời của tôi cung cấp một ý tưởng chung để giải quyết vấn đề liên quan này.
Umer Hayat

2
Tôi sẽ đi với: int ix = inString.indexOf ('.'); if (ix> -1) inString = inString.substring (0, ix); Tôi không biết tại sao Umer đề xuất trừ 1. Đối số thứ hai của chuỗi con là tùy thuộc vào nhưng loại trừ anyway.
Micha Berger

4

Làm thế nào về việc sử dụng regex?

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

Điều này thay thế mọi thứ từ dấu chấm đầu tiên đến cuối bằng "" (tức là nó xóa nó, để lại cho bạn những gì bạn muốn)

Đây là một bài kiểm tra:

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

Đầu ra:

abc

7
Tôi không phản đối, (và tôi đồng ý rằng điều đó thật tệ khi mọi người phản đối không có lý do) nhưng giải pháp của bạn khá đắt và không quá rõ ràng.
TofuBeer

1
@ Knickerless-Noggins Tôi có thể mô tả nó, nếu bạn muốn chi tiết cụ thể, tôi cũng có thể làm điều đó ... nhưng không chắc tôi có thể làm điều đó như thế nào trong một nhận xét (có thể phải thực hiện một câu hỏi / câu trả lời khác). Nó đắt tiền vì nó tạo ra một chuỗi hoàn toàn mới cùng với tất cả các ký tự thay thế. chuỗi con chỉ đơn giản trả về một khung nhìn vào chuỗi. Giúp được gì?
TofuBeer

2
@TofuBeer bạn không chính xác. Chuỗi là bất biến . Chuỗi con không trả về một dạng xem. Mỗi Chuỗi được trả về từ một phương thức Chuỗi là một Chuỗi mới .
Bohemian

@ Knickerless-Noggins Anh ấy đã nhầm ... Xem các bình luận gần đây. Ngoài ra, nó là đủ hiệu quả. Mật độ mã cao - nó sẽ phải được sử dụng nhiều để biện minh cho việc thêm nhiều mã vì lợi ích "hiệu suất".
Bohemian

Nó dường như đã thay đổi trong JDK 7, javarevisited.blogspot.ca/2011/10/...
TofuBeer

2

Trong java.lang.String, bạn nhận được một số phương thức như indexOf (): trả về chỉ mục đầu tiên của một char / string. và lstIndexOf: trả về cho bạn chỉ mục cuối cùng của String / char

Từ Java Doc:

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

Trả về chỉ mục trong chuỗi này của lần xuất hiện đầu tiên của ký tự được chỉ định.


2

Đây là mã trả về một chuỗi con từ a Stringcho đến bất kỳ trong danh sách các ký tự đã cho:

/**
 * 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

Điều này có thể giúp:

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;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.