2016-11-19 5 views
0

я пытаюсь разметить строки в JavaRegex для tokenizing Строки «Мой Foo имеет„нулевой“номер», сахар, «Мой бар„один номер“,»

"My foo, has "zero" number", sugar ,"My bar has "one or more" numbers" 

Выхода должен быть как

"My foo, has "zero" number" 
, 
sugar 
, 
"My bar has "one or more" numbers" 

Кроме того, я использую группу, названную группой захвата, в соответствии с ними.

String[] p = new String[3]; 
    p[0] = "(?<Special>[\\[\\]/.$*\\-+=><#()%,!|&{}])"; 
    p[1] = "(?<Literals>\"[^\"]*\")"; 
    p[2] = "(?<Identifiers>\\w+)"; 
for (String s: p) { 
     sb.append(String.format("|(%s)", s)); 
    } //for ends here 

    Pattern tp = Pattern.compile(new String(sb.substring(1))); // adding the patterns one after another separated by | 

    Matcher m = tp.matcher(line); 

    while (m.find()) { //searches if a token is matched. 
    if ((m.group("Special") != null)) { 
      System.out.println(m.group("Special")); 
      continue; 
     } 
    else if((m.group("Literals") != null)) { 
      System.out.println(m.group("Literals")); 
      continue; 
     } 
    else if((m.group("Identifiers") != null)) { 
      System.out.println(m.group("Identifiers")); 
      continue; 
     } 
    } 

Я могу разметить сахар (используя его для соответствия идентификаторов) с использованием (\ W +) и (с использованием регулярных выражений в специальный). Однако для литералов я не могу соответствовать группе, я думаю, из-за внутренних котировок.

+1

Должны ли избегать ваших внутренних котировок? Каково правило, которое предотвращает «Мой foo, имеет» 'от вашего первого токена? –

+0

Да, это должно было сбежать, но это не так. :( – Ronn

ответ

0

Попробуйте использовать другой подход. String.split() в Java может принимать регулярное выражение аргумент, и если вы разделите на этой схеме:

("\s*)?,(?(1)|\s*") 

Это будет выплюнуть массив, который вы хотите (минус запятые). То, как это работает, будет соответствовать запятой, которой предшествует или следует кавычка (но не оба). Он делает это, используя conditional ((?(1)|...), который будет соответствовать его рисунку, если первая группа захвата не соответствует).

Demo on Regex101

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

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