2015-05-06 8 views
0

Я создал класс на Java, чтобы создать объект, и один из моих статических методов преобразует некоторый JSON в объект (у меня есть версия JavaScript, чтобы он упрощал перенос).Получить группу RegEx по индексу

Образец бит JSON является:

{"header": ["H1","H2","H3"], "cells": [["R1C1","R1C2","R1C3"],["Row 2, Column 1","Row 2, C2","R2 - C2"]]} 

В моем методе, я не использую любой пакет JSON, потому что, насколько я знаю, это потребовало бы мне того, чтобы скачать один, так что я мы использовали RegEx для извлечения данных.

Метод:

public static Table jsonToTable(String json) { 
    Pattern h = Pattern.compile("\"header\": \[((?:\" *[^\"]+ *\",?)+)]"); 
    Pattern r = Pattern.compile("\"cells\": \[((\[(?:(?:\" *[^\"]+ *\",?)+)],?)+)]"); 

    Matcher hm = h.matcher(json); 
    Matcher rm = r.matcher(json); 

    ArrayList<String> header = new ArrayList(Arrays.asList(hm.group(0).split(","))); 
    String[] _rows = rm.group(0).split(","); 
    ArrayList<ArrayList<String>> rows = new ArrayList<ArrayList<String>>(); 
    for (String row : _rows) { 
     row = row.replace("[",""); 
     row = row.replace("]",""); 
     rows.add(new ArrayList(Arrays.asList(row.split(",")))); 
    } 
    Table t = new Table(header); 
    for (ArrayList<String> row : rows) { 
     t.addRow(row); 
    } 
    return t; 
} 

С помощью этого метода, я получаю ошибку времени выполнения всякий раз, когда я использую его. Я вообще не получаю описания, поэтому я не на 100% уверен в том, что вызывает ошибки. Я просто принимаю группы.

С шаблонами, однако, как я их написал выше, скобки с открытием [ были сбежаны, хотя составителю ideone.com это не нравится, так что это возможно, это проблема.

Может ли кто-нибудь сказать мне, что вызывает ошибку Runtime? Я пробовал все, что мог придумать.

+2

Это очень плохая идея для разбора JSON с помощью регулярных выражений. Для этого доступно множество готовых библиотек. –

+0

Вы не можете создать регулярное выражение, которое будет хорошим парсером (по крайней мере, не на Java, где regex не поддерживает рекурсию). Например, в вашем '[^ \"] + 'вы предполагаете, что содержимое String не может иметь' '' внутри, но это неверно. Мы можем разместить '' ', если мы избежим его правильно. Даже если вы пишете регулярное выражение для своего собственного класса, все равно лучше использовать правильный парсер, а не изобретать его. – Pshemo

+0

@Pshemo Я знаю это. Я работаю над улучшением его после того, как я получите базовые навыки. – Spedwards

ответ

0

Вы не можете использовать метод group() объекта Matcher, если у вас нет соответствия. Вы должны использовать этот метод внутри блоков, как:

while(matcher.find()){ //this if you want to match globally 
     String matched = matcher.group(); 
} 

или

if(matcher.find()){ //this if you want just the first match 
     String matched = matcher.group(); 
} 
Смежные вопросы