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

时间:2016-05-03 09:39:02

标签: java regex

我正在制作一个可以用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没有被空格所取代。

我对正则表达式不是很擅长,所以如何更换每个不是数字,点(小数点)或单词" TBD"在Java中用空格?

谢谢!

5 个答案:

答案 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

这将始终匹配字符串末尾的数字。所以领导字符串是什么并不重要。这也将匹配点。