2013-05-23 2 views
0

Я пытаюсь использовать регулярное выражение для разделения строки в поле, но, к сожалению, он не работает на 100% и пропускает часть, которую нужно разделить. Вот часть строки обработки программы:java: regex для строки

void parser(String s) { 
    String REG1 = "(',\\d)|(',')|(\\d,')|(\\d,\\d)"; 
    Pattern p1 = Pattern.compile(REG1); 
    Matcher m1 = p1.matcher(s); 
while (m1.find()) { 

      System.out.println(counter + ": "+s.substring(end, m1.end()-1)+" "+end+ " "+m1.end()); 
      end =m1.end(); 
     counter++; 
    } 
} 

Строка:

s= 3101,'12HQ18U0109','11YX27X0041','XX21','SHV7-P Hig, Hig','','GW1','MON','E','A','ASEXPORT-1',1,101,0,'0','1500','V','','',0,'mb-master1' 

и проблема заключается в том, что она не расщепляется ,1, или ,0,

Правила для синтаксического анализа являются: Строка заключенном ,' ',, например ,'ASEXPORT-1', int прилагается только , ,

ожидается выход =

3101 | 12HQ18U0109 | 11YX27X0041 | XX21 | SHV7-P Hig, Hig| |GW1 |MON |E | A| ASEXPORT-1| 1 |101 |0 | 0 |1500 | V| | | 0 |mb-master1 

В общей сложности 21 элементов.

+3

Почему вы не '' String.split (',') 'сначала, а затем смотрите на разбиения, если они заключены в '' 'или нет? – Fildor

+1

Может ли строка содержать запятую? (Например, 'str, ing') – gkalpak

+0

Я думаю, вы могли бы просто разделить строку while на «,», а затем элементы, заключенные в одинарные кавычки, будут строками, а элементы без одинарных кавычек - это int .. – Oneb

ответ

4

Вы можете разделить его с этим регулярным выражением

,(?=([^']*'[^']*')*[^']*$) 

Он расщепляется на , только если есть четное число ' впереди


Так

3101,'12HQ18,U0109','11YX27X0041' 

выход будет

3101 
'12HQ18,U0109' 
'11YX27X0041' 

Примечание

это не будет работать для вложенных строк, как 'hello 'h,i'world' ..если есть такие случаи, вы должны использовать следующее регулярное выражение

(?<='),(?=')|(?<=\d),(?=\d|')|(?<=\d|'),(?=\d) 
+0

нет такого случая, как в примечании, thx в любом случае, очень помогает – sala

0

Если вы (по какой-то причудливой причине), нужно знать каждый начальный и конечный индексы матчей в исходной строке (например, у вас есть в вашем примере), вы можете использовать следующий шаблон:

String regex = "('[^']*'|\\d+)"; 

, который будет соответствовать цепочки без кавычек или одной строки.
При желании вы можете удалить начальные и конечные ' с помощью «второй проход» на совпадающей подстроки:

match = match.replaceAll("\\A'|'\\Z", ""); 

, который заменяет собой ведущие и замыкающие ' ни с чем.

Код может выглядеть следующим образом:

Pattern pat = Pattern.compile("('[^']*'|\\d+)"); 
Matcher m = pat.matcher(str); 

int counter = 0, start = 0; 
while (m.find()) { 
    String match = m.group(1); 
    int end = start + match.length(); 
    match = match.replaceAll("\\A'|'\\Z", ""); // <-- comment out for NOT replacing 
               //  leading and trailing quotes 
    System.out.format("%d: %s [%d - %d]%n", ++counter, match, start, end); 
    start = end + 1; // <-- the "+1" is to account for the ',' separator 
} 

См, также, это short demo.

 Смежные вопросы

  • Нет связанных вопросов^_^