我正在制作一个可以用Java从www.mangafox.me下载漫画的脚本。
不幸的是,这个网站没有任何API,因此我使用一些古老的方法来获取我的数据。但是,可以在漫画的每个章节中获得一个xml。例如:http://mangafox.me/rss/nisekoi.xml。
我解析了这个xml并使用title
标签来获取章节的编号和相关的音量。
例如,我有一个这样的字符串:
Nisekoi Vol TBD Ch 215
我希望仅保留TBD
和215
。
目前,我用空格替换所有非数字字符,并使用以下内容保留TBD
的每个出现次数:
String title = "Nisekoi Vol TBD Ch 215";
title = title.replaceAll("[^0-9.\bTBD\b]+", " ").trim();
title
等于"TBD 215"
,然后我使用title.split(" ")
获取音量和章节。
这个工作正常,直到我用一个以T开头的漫画做同样的事情。显然,大写字母T没有被空格所取代。
我对正则表达式不是很擅长,所以如何更换每个不是数字,点(小数点)或单词" TBD"在Java中用空格?
谢谢!
答案 0 :(得分:1)
KISS - 保持简单愚蠢:使用\\d+$
抓住标题末尾的数字,然后像TBD
+ your_number
一样隐藏你的标题。
答案 1 :(得分:0)
我想那是" Vol"和" Ch"这里是固定部分,所以你可以使用这个正则表达式:
Vol (.*) Ch (.*)
并检索它的卷的第一组,以及该章的第二组。
您可以在行动here中看到java代码。
仅供参考,您因为使用了一个字符类([...]
)而出现错误,这意味着"以下类中的任何字符"而不是"这个字符序列"。
答案 2 :(得分:0)
如果没有正则表达式,我会尝试这样的事情:
StringBuilder sb = new StringBuilder(title.length());
for (int i = 0; i < title.length(); ++i) {
char ch = title.charAt(i);
if (ch == '.' || Character.isDigit(ch) {
sb.append(ch);
} else if (ch == 'T' && title.indexOf("TBD", i) == i) {
sb.append("TBD");
i += 2;
}
}
title = sb.toString();
答案 3 :(得分:0)
这应该可以解决问题
Pattern pattern = Pattern.compile("Vol ([A-Z]{3}) Ch (\\d{3})");
Matcher matcher = pattern.matcher(input);
if(matcher.find()){
String volume = matcher.group(1);
String chapter = matcher.group(2);
}
答案 4 :(得分:0)
这里有很多答案 - 所以这是我的,它扩展了Jan的答案。
String title = "Nisekoi Vol TBD Ch 215.5";
Pattern pattern = Pattern.compile("[\\.\\d]+$");
Matcher matcher = pattern.matcher(title);
if (matcher.find())
{
System.out.println("TBD " + matcher.group(0));
}
输出为:TBD 215.5
。
这将始终匹配字符串末尾的数字。所以领导字符串是什么并不重要。这也将匹配点。