2015-01-07 3 views
0

мне нужно, чтобы получить следующую информацию из файла XML:Java регулярное выражение в скобках

"abridged_cast": [ 
     { 
     "name": "Tom Hanks", 
     "characters": ["Woody"] 
     }, 
     { 
     "name": "Tim Allen", 
     "characters": ["Buzz Lightyear"] 
     }, 
     { 
     "name": "Joan Cusack", 
     "characters": ["Jessie the Cowgirl"] 
     }, 
     { 
     "name": "Don Rickles", 
     "characters": ["Mr. Potato Head"] 
     }, 
     { 
     "name": "Wallace Shawn", 
     "characters": ["Rex"] 
     } 
    ], 

До сих пор я был в состоянии сократить его:

"abridged_cast": [ 
    { 
     "name": "Tom Hanks", 
     "characters": ["Woody"] 

Значение выше получается с помощью этого регулярное выражение:

\"abridged_cast\": \\[([^]]+)\\] 

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

+2

IMHO с использованием JSON lib будет гораздо более простым подходом – reto

+5

Aaack. Не используйте регулярные выражения для разбора JSON. Используйте анализатор JSON. – ajb

+3

Это действительный JSON, вы можете разобрать его с Джексоном или GSON. – pbespechnyi

ответ

1

Это немного крушение поезда, но:

"abridged_cast": \[(\s*\{\s*"name": "[a-zA-Z .]+",\s*"characters": \[("[a-zA-Z .]+",)*"[a-zA-Z .]+"\]\s*\}(,(?=\s*\{)|\s))*\s*\],? 

demo См.

Поскольку поле «символы» представляет собой массив, я допустил несколько терминов там, пример которого я включил в демо.

Обратите внимание, что я только что показал сырое регулярное выражение; чтобы использовать его в java, вам придется избегать цитат и обратных косых черт (которых у меня не было живота).

+0

Работал отлично. Я пытался сделать это, не делая такого огромного, но в конце концов все равно. – Nox

0

Если у вас есть полный и действительный JSON, вы можете разобрать его с помощью Jackson или GSON.

Это классы данных:

public static class Role { 
    private String name; 
    private List<String> characters; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public List<String> getCharacters() { 
     return characters; 
    } 

    public void setCharacters(List<String> characters) { 
     this.characters = characters; 
    } 
} 

public static class Cast { 
    @JsonProperty("abridged_cast") 
    private List<Role> roles; 

    public List<Role> getRoles() { 
     return roles; 
    } 

    public void setRoles(List<Role> roles) { 
     this.roles = roles; 
    } 
} 

И это, как вы можете разобрать его:

ObjectMapper om = new ObjectMapper(); 
Cast cast = om.readValue(s, Cast.class); 

где s ваш JSON.

+0

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

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