Regex (Java) помощь - PullRequest
       15

Regex (Java) помощь

0 голосов
/ 22 декабря 2009

Как мне разбить строку, разделенную запятой + кавычкой, на набор строк:

String test = "[\"String 1\",\"String, two\"]"; 
String[] embeddedStrings = test.split("<insert magic regex here>");
//note: It should also work for this string, with a space after the separating comma: "[\"String 1\", \"String, two\"]";    

assertEquals("String 1", embeddedStrings[0]);
assertEquals("String, two", embeddedStrings[1]);

Я в порядке с обрезкой квадратных скобок в качестве первого шага. Но подвох в том, что даже если я это сделаю, я не могу просто разделить запятую, потому что во встроенных строках могут быть запятые. Использование Apache StringUtils также допустимо.

Ответы [ 4 ]

3 голосов
/ 23 декабря 2009

Вы также можете использовать одну из множества небольших библиотек с открытым исходным кодом для анализа CSV, например, opencsv или Commons CSV .

1 голос
/ 23 декабря 2009

Если вы можете удалить [\" из начала внешней строки и \"] из ее конца стать:

      String test = "String 1\",\"String, two"; 

Вы можете использовать:

     test.split("\",\"");
0 голосов
/ 23 декабря 2009

Метод грубой силы, часть из этого может быть псевдокодом, и я думаю, что есть проблема забора при установке currStart и / или String.substring (). Это предполагает, что скобки уже удалены.

boolean inquote = false;
List strings = new ArrayList();
int currStart=0;
for (int i=0; i<test.length(); i++) {
  char c = test.charAt(i);
  if (c == ',' && ! inquote) {
    strings.add(test.substring(currStart, i);
    currStart = i;
  }
  else if (c == ' ' && currStart + == i)
    currStart = i; // strip off spaces after a comma
  else if (c == '"')
    inquote != inquote;
}
strings.add(test.substring(currStart,i));
String embeddedStrings = strings.toArray();
0 голосов
/ 23 декабря 2009

Это очень хрупкий файл, и его следует избегать, но вы можете сопоставить строковые литералы.

Pattern p = Pattern.compile("\"((?:[^\"]+|\\\\\")*)\"");

String test = "[\"String 1\",\"String, two\"]";
Matcher m = p.matcher(test);
ArrayList<String> embeddedStrings = new ArrayList<String>();
while (m.find()) {
    embeddedStrings.add(m.group(1));
}

Регулярное выражение предполагает, что двойные кавычки во входных данных экранируются с использованием \", а не "". Шаблон сломался бы, если бы входные данные имели нечетное число (неэкранированных) двойных кавычек.

...