Как вы можете разобрать строку, которая имеет квалификатор текста - PullRequest
3 голосов
/ 05 июля 2010

Как я могу разобрать String str = "abc, \"def,ghi\"";

так, чтобы я получил вывод как

String[] strs = {"abc", "\"def,ghi\""}

, то есть массив длины 2.

Должен ли я использоватьрегулярное выражение или есть какой-либо метод в Java API или любой другой проект с открытым исходным кодом

, который позволяет мне сделать это?

Отредактировано

Чтобы дать контекст опроблема, я читаю текстовый файл, который имеет список записей по одной в каждой строке.Каждая запись имеет список полей, разделенных разделителем (запятая или точка с запятой).Теперь у меня есть требование, при котором я должен поддерживать классификатор текста, который поддерживает Excel или Open Office.Предположим, у меня есть запись

abc, "def, ghi"

. Здесь мой разделитель и "мой текстовый классификатор, такой, что когда я анализирую эту строку, я должен получить два поля abc и def, ghi not {abc, def, ghi}

Надеюсь, это отменит мое требование.

Спасибо

Шекхар

Ответы [ 4 ]

5 голосов
/ 05 июля 2010

Основной алгоритм не слишком сложен:

 public static List<String> customSplit(String input) {
   List<String> elements = new ArrayList<String>();       
   StringBuilder elementBuilder = new StringBuilder();

   boolean isQuoted = false;
   for (char c : input.toCharArray()) {
     if (c == '\"') {
        isQuoted = !isQuoted;
        // continue;        // changed according to the OP comment - \" shall not be skipped
     }
     if (c == ',' && !isQuoted) {
        elements.add(elementBuilder.toString().trim());
        elementBuilder = new StringBuilder();
        continue;
     }
     elementBuilder.append(c); 
   }
   elements.add(elementBuilder.toString().trim()); 
   return elements;
}
2 голосов
/ 05 июля 2010

Этот вопрос кажется уместным: Разделить строку, игнорируя разделенные на кавычки разделы

Вдоль этой строки, http://opencsv.sourceforge.net/ кажется подходящим.

0 голосов
/ 05 июля 2010

Попробуйте:

List<String> res = new LinkedList<String>();

String[] chunks = str.split("\\\"");
if (chunks.length % 2 == 0) {
    // Mismatched escaped quotes!
}
for (int i = 0; i < chunks.length; i++) {
    if (i % 2 == 1) {
        res.addAll(Array.asList(chunks[i].split(",")));
    } else {
        res.add(chunks[i]);
    }
}

Это разделит только те части, которые не находятся между экранированными кавычками.

Вызовите trim (), если хотите избавиться от пробелов.

0 голосов
/ 05 июля 2010

Попробуйте это -

 String str = "abc, \"def,ghi\"";
            String regex = "([,]) | (^[\"\\w*,\\w*\"])";
            for(String s : str.split(regex)){
                System.out.println(s);
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...