2013-05-06 2 views
3

Я знаю, как tokenize String, но проблема в том, что я хочу tokenize, как показано ниже.Сплит-строка с альтернативной запятой (,)

String st = "'test1, test2','test3, test4'"; 

То, что я пытался, как показано ниже:

st.split(","); 

Это дает мне выход, как:

'test1 
test2' 
'test3 
test4' 

Но я хочу, как выход:

'test1, test2' 
'test3, test4' 

Как мне это сделать?

+2

Вы можете разделить на '', '' –

+2

возможно' split ("', '") '? –

+0

Обязательные одинарные кавычки? – dasblinkenlight

ответ

3

Поскольку одинарные кавычки not mandatory, split не будет работать, потому что механизм регулярных выражений Java не допускает выражений lookbehind переменной длины. Вот простое решение, которое использует регулярное выражение, чтобы соответствовать содержанию, а не разделители:

String st = "'test1, test2','test3, test4',test5,'test6, test7',test8"; 
Pattern p = Pattern.compile("('[^']*'|[^,]*)(?:,?)"); 
Matcher m = p.matcher(st); 
while (m.find()) { 
    System.out.println(m.group(1)); 
} 

Demo on ideone.

Вы можете добавить синтаксис для экранирования одинарного пути изменения «содержание» части цитируемой подстроки (в настоящее время, это [^']*, что означает «ничего, кроме одной цитаты повторяется ноль или более раз).

+0

Да! это касается этих 2 вопросов в моем ответе! – codeMan

1

Простейшим и надежным решением было бы использовать парсер CSV. Может быть, Commons CSV поможет.

Он будет обрезать строки на основе правил CSV. Таким образом, даже '' может использоваться в пределах значения, не нарушая его.

Образец кода будет выглядеть так: ByteArrayInputStream baos = new ByteArrayInputStream ("'test1, test2', 'test3, test4'". GetBytes());

CSVReader reader = new CSVReader(new InputStreamReader(baos), ',', '\''); 

    String[] read = reader.readNext(); 
    System.out.println("0: " + read[0]); 
    System.out.println("1: " + read[1]); 

    reader.close(); 

Это будет печатать:

0: test1, test2 
1: test3, test4 

Если вы используете Maven вы можете просто импортировать зависимость:

<dependency> 
     <groupId>net.sf.opencsv</groupId> 
     <artifactId>opencsv</artifactId> 
     <version>2.0</version> 
    </dependency> 

и начать использовать его.