2016-05-03 3 views
3

Я работаю над скриптом, который может загружать манга из www.mangafox.me в Java.Удалить все нечисловые символы, но сохранить определенное слово

К сожалению, на этом сайте нет 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?

Спасибо!

+1

Если я получу вас правильно, вас интересует только номер в конце каждого заголовка, верно? Вы можете пойти за ['\\ d + $'] (https://regex101.com/r/gA1zW9/1) и затем 'TBD' +' your_number'. – Jan

ответ

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

Я немного изменил ваше решение и разделил соответствие в двух парсах (один для тома и один для главы), так как в некоторых главах нет тома. 'matcher.find()' в вашем примере не вернет true. Но спасибо вам, это именно то, что мне нужно :)! –

0

Я предполагаю, что «Том» и «Ch» являются неподвижные части здесь, так что вы могли бы использовать это регулярное выражение:

Vol (.*) Ch (.*) 

и получить его первой группы по объему и ее второй по главе.

Вы можете увидеть код java в действии here.

FYI У вас ошибка, потому что вы используете класс символов ([...]), что означает «любой символ следующего класса», а не «эта последовательность символов».

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

ПОЦЕЛУЙ - Держите это глупо просто: возьмите номер в конце названия с \\d+$ и последующим концентом вашего названия, например TBD + your_number.

+1

Собирался опубликовать это решение. Также можно вставить фрагмент кода для этого. –

+0

@MuratK .: Иди к этому - я не слишком хорошо знаком с «Java». – Jan

+0

Готово. Я также расширил его для символьной точки. –

0

Есть много ответов здесь - так вот моя, которая проходит ответ с января

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.


Это всегда будет соответствовать номерам в конце строки. Поэтому не имеет значения, что ведет строка. Это также будет совпадать с точками.

Смежные вопросы