我试图通过使用BufferedReader来分隔一个非常大的.cvs(255列),该BufferedReader抓取每行并将其存储在字符串中。
我希望能够通过命令和字母将其拆分。 例如:
1,2,3,5,6
将拆分为
1 | 2 | 3 | 4 | 5 | 6 | 7
hello,world,good day to you, Sir,test
将拆分为
你好世界|先生,祝您有美好的一天|测试
请注意,我只分隔了一个字母数字后面的逗号。空格前的逗号不是分隔的,而是句子的一部分。
答案 0 :(得分:2)
对于每个字符串a
:
a.split(",(?=\\S)");
答案 1 :(得分:1)
要使用逗号和字母数字字符进行拆分,请使用
String pattern = ",(?=\\p{Alnum})";
或者,如果您打算支持任何Unicode字母,请传递Pattern.UNICODE_CHARACTER_CLASS
((?U)
)选项和模式:
String pattern = "(?U),(?=\\p{Alnum})";
Java演示:
String s = "hello,world,good day to you, Sir,test,1,2";
String[] result = s.split(",(?=\\p{Alnum})");
for (String r:result) {
System.out.println(r);
}
输出:
hello
world
good day to you, Sir
test
1
2
答案 2 :(得分:0)
在此链接中,有一个答案说明了Lookahead and Lookbehind的用法。 我在这里留下了我认为可以解决您描述的问题的代码:
private static String[] mySplit(final String line, final char separator) {
String regex = "((?<=(" + separator + "\\w)|(?=(" + separator + "\\w))))";
String[] split = line.split(regex);
List<String> list = new ArrayList<>();
for (int i = 0; i < split.length; i++) {
String token = split[i];
if (token.startsWith(String.valueOf(separator))) {
split[i + 1] = token.substring(1) + split[i + 1];
} else {
list.add(token);
}
}
return list.toArray(new String[list.size()]);
}
private static String concatenate(final String[] tokens, final char separator){
StringBuilder builder = new StringBuilder();
for (int i = 0; i < tokens.length; i++) {
builder.append(tokens[i]).append((i < tokens.length - 1) ? separator : "");
}
return builder.toString();
}
public static void main(String[] args) {
final String line = "hello,world,good day to you, Sir,test";
final String[] tokens = mySplit(line, ',');
final String newLine = concatenate(tokens, '|');
System.out.println("newLine = " + newLine);
}