As you can see in your debuggex first match of your regex is
{"air_date":"2009-03-08","episodes
so you have only match in group 1 (2009-03-08 part) but group 2 is empty (which represents null) and since you are passing that null to Integer.parseInt yo are getting NumberFormatException: null. To be sure that you are handling match for episodes
episode_number":1,
test if value of group 2 isn't null like
while (filter.find()) {
if (filter.group(1) != null) {
this.ano = Integer.parseInt(filter.group(1));
}
if (filter.group(2) != null) {
episodios.add(new Episodio(idSerie, temporada, Integer.parseInt(filter.group(2))));
}
}
But in real world you shouldn't parse JSon with regex, but with proper parser like GSon, Jackson. Here is example of how you can do it with GSon.
String data = new Scanner(new File("input.txt")).useDelimiter("\\A").next();
Gson gson = new Gson();
Season season = gson.fromJson(data, Season.class);
//test
System.out.println(season.getName());
System.out.println("-------");
for (Episode ep : season.getEpisodes())
System.out.println(ep.getEpisode_number()+"\t"+ep.getName());
Output:
Season 2
-------
1 Seven Thirty-Seven
2 Grilled
3 Bit by a Dead Bee
4 Down
5 Breakage
6 Peekaboo
7 Negro Y Azul
8 Better Call Saul
9 4 Days Out
10 Over
11 Mandala
12 Phoenix
13 ABQ
used classes
public class Episode {
private String air_date;
private Integer episode_number;
private String name;
private String overview;
private String still_path;
private Double vote_average;
private Integer vote_count;
//getters & setters
}
public class Season {
private String air_date;
private List<Episode> episodes = new ArrayList<Episode>();
private String name;
private String overview;
private Integer id;
private String poster_path;
private Integer season_number;
private String additionalProperties;
//getters & setters
}
(.*?)means exactly the same thing as(.*). Also, if you use single quotes'around the entire expression, then you won't have to escape all the double quotes"inside the expression:compile('\\{"air_date":"(.*)-.*-.*","episodes|(?:episode_|\\G)number":(.*?),')\d*which will match only numbers instead of.*.