Sử dụng String.split () với nhiều dấu phân cách


201

Tôi cần phải phân chia một chuỗi cơ sở trên dấu phân cách -.. Dưới đây là đầu ra mong muốn của tôi.

AA.BB-CC-DD.zip ->

AA
BB
CC
DD
zip 

nhưng mã sau đây của tôi không hoạt động.

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

Dựa trên những gì bạn nói, có vẻ như nó đang hoạt động tốt. Đầu ra mong muốn của bạn là gì?
Jeff

2
@Jeff: Anh ấy đã cho thấy đầu ra mong muốn của mình ( AA/ BB/ CC...)
TJ Crowder

2
Bạn có chắc không? Tôi giải thích rằng đó là đầu ra hiện tại của anh ấy, không phải đầu ra mong muốn của anh ấy. Có lẽ đã đến lúc đứng lên và đi loanh quanh một chút.
Jeff

@Jeff: Xin lỗi vì sự nhầm lẫn, tôi đã cập nhật bài viết của mình để xóa sự hiểu lầm của bạn.
Thắng Phạm

Regex sẽ làm giảm hiệu suất của bạn. Tôi khuyên bạn nên viết một phương thức sẽ đi theo từng ký tự và tách chuỗi nếu cần. Bạn có thể tối ưu hóa điều này hơn nữa để có được hiệu suất log (n).
Princesh

Câu trả lời:


311

Tôi nghĩ bạn cần bao gồm toán tử regex OR :

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

Những gì bạn có sẽ khớp:
[DASH theo sau là DOT cùng nhau] -.
không phải
[DASH hoặc DOT bất kỳ trong số họ] -hoặc.


9
Tại sao chúng ta yêu cầu hai dấu gạch chéo ngược ??
pjain

7
.tự trong regex có nghĩa là bất kỳ ký tự nào khác ngoài dòng mới. guidespoint.com/java/java_THER_expressions.htm Trong trường hợp này, tuy nhiên, họ muốn nhân vật thực tế .. Hai dấu gạch chéo ngược cho biết bạn đang đề cập đến .. Dấu gạch chéo ngược là một ký tự thoát.
Khỉ 21/2/2016

2
đối với các trường hợp bình thường .split("match1|match2"), (vd. split("https|http")), \ là thoát khỏi char đặc biệt .trong trường hợp trên
nguyện

hoặc nói chung, bạn có thể sử dụng pdfName.split("\\W");như dưới đây câu trả lời
@Peter

1
sử dụng [-.]thay vì-|\\.
Saeed

49

Hãy thử regex này "[-.]+". Dấu + sau khi coi các ký tự phân cách liên tiếp là một. Hủy bỏ cộng nếu bạn không muốn điều này.


8
@Lurkers: Lý do duy nhất Peter không phải trốn thoát đó -là suy nghĩ đầu tiên bên trong [], nếu không, cần phải có một dấu gạch chéo phía trước nó (và tất nhiên, để đặt dấu gạch chéo ngược trước nó, chúng tôi cần hai vì đây là một chuỗi ký tự).
TJ Crowder

Tôi nghĩ rằng câu trả lời này tốt hơn câu trả lời được chấp nhận, bởi vì khi bạn sử dụng toán tử logic |, vấn đề là một trong những dấu phân cách của bạn có thể là một phần trong kết quả 'mã thông báo' của bạn. Điều này sẽ không xảy ra với [-.] +
Jack '

26

Bạn có thể sử dụng regex "\ W". Điều này khớp với bất kỳ ký tự không phải từ nào. Dòng bắt buộc sẽ là:

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

nó không hoạt động đối với tôi `String s =" id (INT), name (STRING), ". Sử dụng \\ W ở đây sẽ tạo ra một mảng có độ dài 6 trong đó chỉ có 4
user3527975

2
Điều này cũng sẽ phá vỡ khi đầu vào chứa ký tự Unicode. Tốt nhất là chỉ bao gồm dấu phân cách thực tế, thay vì "lấy tất cả" với \W.
nhahtdh

13

Chuỗi bạn đưa ra splitlà dạng chuỗi của biểu thức chính quy, vì vậy:

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

Điều đó có nghĩa là phân chia bất kỳ ký tự nào trong [](chúng ta phải thoát -bằng dấu gạch chéo ngược vì bên trong nó đặc biệt []; và tất nhiên chúng ta phải thoát dấu gạch chéo ngược vì đây là chuỗi). (Ngược lại, .thông thường là đặc biệt nhưng bên trong không đặc biệt [].)


Bạn không cần phải thoát dấu gạch nối trong trường hợp này, vì [-.]có thể không thể hiểu là một phạm vi.
Alan Moore

1
@Alan: Bởi vì đó là điều đầu tiên trong lớp, điều đó hoàn toàn đúng. Nhưng tôi luôn làm thế, thật dễ dàng để quay lại sau và thêm một cái gì đó trước mặt mà không cần suy nghĩ. Thoát nó không tốn kém gì, vì vậy ...
TJ Crowder

Bạn có biết làm thế nào để thoát khỏi dấu ngoặc? Tôi có Chuỗi "[200] Kỹ thuật" mà tôi muốn chia thành "200", "Kỹ thuật"
scottysseus

3
Ồ wow, tôi hiểu rồi ... Tôi phải sử dụng hai dấu gạch chéo ngược thay vì một. String[] strings = codes.get(x).split("\\[|\\]| ");<- mã cho bất kỳ ai quan tâm
scottysseus

13

Sử dụng quả ổi bạn có thể làm điều này:

Iterable<String> tokens = Splitter.on(CharMatcher.anyOf("-.")).split(pdfName);

4

Đối với hai chuỗi char là dấu phân cách "VÀ" và "HOẶC", điều này nên được thực hiện. Đừng quên cắt tỉa trong khi sử dụng.

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

Kết quả: thành phố = {"ISTANBUL", "NEW YORK", "PARIS", "TOKYO", "MOSCOW"}


Làm cách nào tôi có thể nhận được đầu ra như {"ISTANBUL VÀ", "NEW YORK VÀ", "PARIS HOẶC", "TOKYO VÀ", "MOSCOW"}
Ahamadullah Saikat

3

Tôi sẽ sử dụng Apache Commons:

nhập khẩu org.apache.commons.lang3.StringUtils;

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

Nó sẽ phân tách trên bất kỳ dấu phân cách nào được chỉ định, ngược lại StringUtils.splitByWholeSeparator(str, separator)sử dụng chuỗi hoàn chỉnh làm dấu phân cách


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

9
Vui lòng giúp chống lại sự hiểu lầm rằng StackOverflow là một dịch vụ viết mã miễn phí, bằng cách tăng câu trả lời chỉ mã của bạn với một số giải thích.
Yunnosch

2

Tốt hơn là sử dụng một cái gì đó như thế này:

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

Đã thêm một vài nhân vật khác làm mẫu. Đây là cách an toàn nhất để sử dụng, bởi vì cách .'được điều trị.


1

Bạn cũng có thể chỉ định biểu thức chính quy làm đối số trong phương thức split () .. xem ví dụ bên dưới ....

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

1

Hãy thử mã này:

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

1
Vui lòng giúp chống lại sự hiểu lầm rằng StackOverflow là một dịch vụ viết mã miễn phí, bằng cách tăng câu trả lời chỉ mã của bạn với một số giải thích.
Yunnosch

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

nên làm việc.


2
Đầu tiên, không, nó không hoạt động - có lẽ bạn có thể thử nó trước khi đăng? Sau đó, câu trả lời này giống như của bạn - nhưng làm việc. Cuối cùng, bạn nên kiểm tra định dạng của bạn ( nên hoạt động. ).
Bắt đầu

1
Vui lòng giúp chống lại sự hiểu lầm rằng StackOverflow là một dịch vụ viết mã miễn phí, bằng cách tăng câu trả lời chỉ mã của bạn với một số giải thích.
Yunnosch

-1

Nếu bạn biết sting sẽ luôn ở cùng một định dạng, trước tiên hãy phân tách chuỗi dựa trên .và lưu trữ chuỗi ở chỉ mục đầu tiên trong một biến. Sau đó phân tách chuỗi trong chỉ mục thứ hai dựa trên -và lưu trữ các chỉ mục 0, 1 và 2. Cuối cùng, tách chỉ mục 2 của mảng trước đó dựa trên .và bạn sẽ có được tất cả các trường có liên quan.

Tham khảo đoạn trích sau:

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

6
Nó có thể được thực hiện trong một bước, vì vậy hãy thực hiện trong một bước. Xem các trả lời khác.
Kaj

2
pdfName.split(".")dẫn đến một mảng có độ dài bằng không.
Alan Moore

1) .Cần phải trốn thoát như\\.
Shri
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.