Как разделить строку запятой, за которой следует только буквенно-цифровой символ - PullRequest
0 голосов
/ 12 февраля 2019

Я пытаюсь разделить очень большие .cvs (255 столбцов) с помощью BufferedReader, который захватывает каждую строку и сохраняет ее в строке.

Я хотел бы иметь возможность разбить его накоманда и письмо.Пример:

1,2,3,5,6 разделится на
1 |2 |3 |4 |5 |6 |7

hello,world,good day to you, Sir,test разделится на
привет |мир |доброго вам дня, сэр |test

обратите внимание, как я разделил запятую, которая следует буквенно-цифровой.Запятые, предшествующие пробелу, не разделяются, вместо этого они являются частью предложения.

Ответы [ 3 ]

0 голосов
/ 12 февраля 2019

В этой ссылке есть ответ, объясняющий использование Lookahead и 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);
}
0 голосов
/ 27 мая 2019

Чтобы разделить запятую с последующим буквенно-цифровым символом, вы можете использовать

String pattern = ",(?=\\p{Alnum})";

или, если вы планируете поддерживать какие-либо буквы Unicode, пропустите параметр Pattern.UNICODE_CHARACTER_CLASS
((?U))вместе с шаблоном:

String pattern = "(?U),(?=\\p{Alnum})";

См. демо RegexPlanet regex .

Демонстрация 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
0 голосов
/ 12 февраля 2019

Для каждой строки a:
a.split(",(?=\\S)");

...