Tách một chuỗi Java bằng ký hiệu ống bằng cách sử dụng split (trực tuyến)


195

Tài liệu chính thức của Java nêu rõ:

"boo:and:foo"Ví dụ, chuỗi mang lại các kết quả sau với các biểu thức này Kết quả Regex:

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

Và đó là cách tôi cần nó để làm việc. Tuy nhiên, nếu tôi chạy này:

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

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

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

nó in:

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

Đó là xa những gì tôi mong đợi:

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

Tại sao chuyện này đang xảy ra?


2
Bản sao có thể có của Cách chia chuỗi trong Java
KIBOU Hassan

Câu trả lời:


423

Bạn cần

test.split("\\|");

splitsử dụng biểu thức chính quy và trong regex | là một metacharacter đại diện cho ORtoán tử. Bạn cần phải thoát ký tự đó bằng cách sử dụng \(được viết bằng String "\\"\nó cũng là một metacharacter trong chuỗi ký tự chuỗi và yêu cầu một ký tự khác \để thoát khỏi nó).

Bạn cũng có thể dùng

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

và hãy Pattern.quotetạo phiên bản thoát của biểu thức regex |.


17
Đó là, split()phương thức lấy regex và |là ký tự đặc biệt cho reg ex
Jigar Joshi

1
bạn là lựa chọn thứ hai của tôi với tư cách là người điều hành trên stack stack. Tất cả tốt nhất.
Däñish Shärmà

33

Sử dụng lối thoát thích hợp: string.split("\\|")

Hoặc, trong Java 5+, sử dụng trình trợ giúp Pattern.quote()đã được tạo cho chính xác mục đích này:

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

mà làm việc với các chuỗi đầu vào tùy ý. Rất hữu ích khi bạn cần trích dẫn / thoát đầu vào của người dùng.


3
Không chắc chắn khi quá trình chuyển đổi được thực hiện, nhưng trong Java 8, người ta sẽ sử dụng Pattern.quote().
RAnders00

4

Sử dụng mã này:

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

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

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

Giải pháp này đã được chỉ ra bởi câu trả lời được chấp nhận. Không cần phải lặp lại nó.
Pshemo

3

Bạn cũng có thể sử dụng thư viện apache và làm điều này:

StringUtils.split(test, "|");

1

Bạn cũng có thể sử dụng .split("[|]").

(Tôi đã sử dụng cái này thay vì .split("\\|"), cái này không hiệu quả với tôi.)


Cả hai phiên bản nên hoạt động tốt. Nếu một người không đề nghị vấn đề là ở một nơi khác.
Pshemo

@Pshemo Điều này tuy nhiên thêm một hương vị thú vị, rằng một số biểu tượng dành riêng không phải thoát ra nếu đặt trong dấu ngoặc.
Pax Vobiscum

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

Chỉ định giới hạn hoặc tối đa sẽ chính xác cho các ví dụ như: "boo ||| a" hoặc "| | boo |" hoặc "|||"

Nhưng test.split("\\|");sẽ trả về các mảng chuỗi có độ dài khác nhau cho cùng một ví dụ.

sử dụng tài liệu tham khảo: liên kết


-2

phương thức split () lấy một biểu thức chính quy làm đối số

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.