2009-12-22 2 views
0

Как разбить это запятая + котировка разделителей строки в набор строк:Regex (Java) помощь

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 также приемлемо.

+0

Значит, вы всегда будете 'String 1' и 'String, two'? Я предполагаю, что вы разделены запятой, цитируйте прилагаемые поля. Являются ли кавычки необязательными или обязательными? – jabbie

ответ

1

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

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

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

 test.split("\",\""); 
+0

Я закончил с этим. Это уродливо, так как большинство регулярных выражений, но оно эффективно и мои параметры ограничены: String noBrackets = StringUtils.substringBetween (test, "[\" "," \ "]"); Строка [] results = noBrackets.split ("\", [] * \ ""); – emulcahy

0

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

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)); 
} 

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

0

метод перебором, некоторые из них могут быть псевдокодами, и я думаю, что существует проблема fencepost при установке 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(); 
3

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