去除所有非数字字符但保留特定单词

3

我正在开发一款能够在Java中从www.mangafox.me下载漫画的脚本。

不幸的是,该网站没有任何API,因此我使用了一些古老的方法来获取我的数据。但是,可以获取每个漫画章节的xml。例如:http://mangafox.me/rss/nisekoi.xml

我解析这个xml,并使用title标签来获取一个章节的编号和相关的卷数。

例如,我有一个像这样的字符串:Nisekoi Vol TBD Ch 215,我想只保留TBD215

目前,我用空格替换所有非数字字符,并使用以下代码保留每个出现的TBD

String title = "Nisekoi Vol TBD Ch 215";
title = title.replaceAll("[^0-9.\bTBD\b]+", " ").trim();
title等于"TBD 215",然后我使用title.split(" ")来获取卷和章节。
这个方法在处理以T开头的漫画时会出现问题。显然,大写字母T没有被替换成空格。
因为我不太擅长正则表达式,所以如何在Java中用空格替换每个不是数字、小数点(用于小数)或单词"TBD"的字符?
谢谢!

1
如果我理解正确的话,你只对每个标题末尾的数字感兴趣,是吗?那么你可以使用 \\d+$ ,然后在后面加上 TBD + 你的数字 - Jan
5个回答

1

KISS - 保持简单愚蠢: 使用 \\d+$ 获取标题末尾的数字,然后将其与标题连接起来,如TBD + your_number


1
正准备发布这个解决方案。不妨插入一段代码片段。 - Murat Karagöz
@MuratK.:加油吧 - 我对Java不是太熟悉。 - Jan
完成。我还为字面上的字符点扩展了它。 - Murat Karagöz

0

我猜“Vol”和“Ch”是固定的部分,所以你可以使用这个正则表达式:

Vol (.*) Ch (.*)

并检索其第一组以获取卷和第二组以获取章节。

您可以在此处查看Java代码的实际操作。

顺便说一句,您遇到错误是因为您正在使用字符类([...]),它表示“以下类中的任何字符”,而不是“这个字符序列”。


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();

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);
}

我稍微调整了一下你的解决方案,并将匹配分为两部分(一个用于卷,一个用于章节),因为有些章节没有卷。在你的例子中,matcher.find() 不会返回 true。但无论如何,非常感谢,这正是我所需要的 :)! - Christian Kula

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


这将始终匹配字符串末尾的数字。因此,字符串前面是什么并不重要。这也将匹配点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接