(我和你住在同一个时区,所以我的尝试也可能不准确,因为我睡着了,但我走了)
如果我对您的理解正确(也在尝试分析您的正则表达式尝试)
-
sXXXXeXXXeXXX 或 sXXXXeXXX-XXX 部分始终位于点之间
-
sXXXX只能存在一次,但可以有1-4位(这里用X表示),
- 赛季信息后必须有
eXXX 部分,并且至少是eXXX 或-XXX 表单中的元素之一(每个元素只能包含1-3 位数字)。
在这种情况下,您可以使用像
这样的正则表达式
[.]s(?<season>\\d{1,4})e(?<episodes>\\d{1,3}([e-]\\d{1,3})+)[.]
意思是
[.]点字面量
s(?<season>\\d{1,4}) 将匹配 sXXXX 并将其存储在名为 season 的组中
e 文字放在季节信息之后(从您的示例中似乎是强制性的)
-
(?<episodes>\\d{1,3}([e-]\\d{1,3})+) 在这种情况下
-
\\d{1,3} 将匹配 XXX
-
([e-]\\d{1,3})+ 和 eXXX 或 -XXX 中的至少一个。
换句话说,它将匹配XXXeXXX、XXX-XXX 甚至类似XXXeXXX-XXX 并将其放在名为episodes 的组中
[.] 点文字放置在搜索到的信息之后
如果您希望有一些包含单独剧集列表的结构,那么您只需将匹配从名为episodes 的组中拆分出来。由于此匹配可以采用XXXeXXX-XXX 的形式,因此您可以在e 或- 上拆分,这可以用正则表达式[e-] 或e|- 表示。
演示:
String[] data = {
"showname.s01e01e02e03.extension",
"showname.s01e01-02-03.extension",
};
Pattern p = Pattern.compile(
"[.]s(?<season>\\d{1,4})e(?<episodes>\\d{1,3}([e-]\\d{1,3})+)[.]",
Pattern.CASE_INSENSITIVE);
for (String input : data){
Matcher m = p.matcher(input);
while (m.find()){
String season = m.group("season");
System.out.println(season);
String episodes = m.group("episodes");
System.out.println(m.group("episodes"));
String[] singleEpisodes = episodes.split("[e-]");
System.out.println("episode numbers"+Arrays.toString(singleEpisodes));
}
System.out.println("-----");
}
输出:
01
01e02e03
episode numbers[01, 02, 03]
-----
01
01-02-03
episode numbers[01, 02, 03]
-----