Saya mencoba mengurai file yang memiliki setiap baris dengan nilai batas pipa. Itu tidak berfungsi dengan benar ketika saya tidak lolos dari pembatas pipa dalam metode split, tetapi itu bekerja dengan benar setelah saya lolos dari pipa seperti di bawah ini.
private ArrayList<String> parseLine(String line) {
ArrayList<String> list = new ArrayList<String>();
String[] list_str = line.split("\\|"); // note the escape "\\" here
System.out.println(list_str.length);
System.out.println(line);
for(String s:list_str) {
list.add(s);
System.out.print(s+ "|");
}
return list;
}
Bisakah seseorang tolong jelaskan mengapa karakter pipa perlu melarikan diri untuk split()
metode ini?
String
dan mengembalikan regexString
yang akan cocok dengan input (yaitu, itu mengurus semua pelarian untuk Anda).Pattern.quote
Jawaban:
String.split
mengharapkan argumen ekspresi reguler. Unescaped|
diuraikan sebagai regex yang berarti "string kosong atau string kosong," yang bukan yang Anda maksud.sumber
Karena sintaks untuk parameter untuk dipecah adalah ekspresi reguler, di mana di '|' memiliki arti khusus OR, dan '\ |' berarti literal '|' jadi string "\\ |" berarti ungkapan reguler '\ |' yang artinya cocok persis dengan karakter '|'.
sumber
Some|Delimited|Text|With|An\|Embedded|Pipe|Char
menjadi("Some", "Delimited", "Text", "With", "An\|Embedded", "Pipe", "Char")
? Fungsi split tidak mendukung pelolosan seperti ini, tetapi Anda mungkin dapat membuat ekspresi reguler yang akan berfungsi untuk kasus ini, seperti dengan pernyataan negatif lebar nol yang terlihat di belakang grup:(?<!\\)\|
yang manaline.split("(?<!\\\\)\\|");
Anda bisa melakukan ini:
sumber