2013-12-01 3 views
0

Я собираюсь извлечь bbcode с кавычками, но безрезультатно, когда наступает фактический вывод.Извлечение цитаты из bbcode с использованием java и Android, но не извлечение содержимого в теге quote

Я хотел бы реализовать модуль синтаксического анализа bbcode для извлечения кавычек в качестве желаемого вывода. Количество цитат должно быть рекурсивный метод или некоторые еще ..

INput : 

Testing [quote]http://www.yourube.com?watch?v=asasdsadsa [url] aisa [/url] [/quote] Testing 

    Desired Output 

Тестирование http://www.yourube.com?watch?v=asasdsadsa [URL] Айса [/ URL] Айса Testing

Actual Output: 

http://www.yourube.com?watch?v=asasdsadsa [url] aisa [/url] 
http://www.yourube.com?watch?v=asasdsadsa aisa 

ниже мой код

 String s = "[quote]http://www.yourube.com?watch?v=asasdsadsa [url] aisa [/url][/quote]"; 
     String t = bbcode(s); 
     System.out.println(t); 
     String u = bbcode2(t); 
     System.out.println(u); 

public static String bbcode(String text) { 
     String html = text; 

     HashMap<String,String> bbMap = new HashMap<String , String>(); 


     bbMap.put("\\[quote\\](.+?)\\[/quote\\]", "$1"); 


     for (Map.Entry entry: bbMap.entrySet()) { 
      html = html.replaceAll(entry.getKey().toString(), entry.getValue().toString()); 
     } 

     return html; 
    } 

     public static String bbcode2(String text) { 
     String html = text; 

     HashMap<String,String> bbMap = new HashMap<String , String>(); 



     bbMap.put("\\[quote\\](.+?)\\[/quote\\]", "$1"); 

     bbMap.put("\\[url\\](.+?)\\[/url\\]", "$1"); 

     for (Map.Entry entry: bbMap.entrySet()) { 
      html = html.replaceAll(entry.getKey().toString(), entry.getValue().toString()); 
     } 

     return html; 
    } 
+0

Вы пытаетесь разобрать HTML? – fdsa

+0

нет, я использую «$ 1» для извлечения исходного содержимого в теге –

+0

Не могли бы вы объяснить немного больше о том, что должна делать эта программа? – fdsa

ответ

1

Это общее Java регулярное выражение, чтобы соответствовать пары BB Code теги:

\\[([^\\]]+)\\](.+?)\\[/\\1\\] 

Это будет захватывать верхний уровень спичек, например, в [a][b] hi [/b] hello [/a][c] yo [/c], группа 2 будет соответствовать [b] hi [\b] hello и yo. (Demonstrated here)


Любое регулярное решение на мой взгляд будет требовать вам использовать рекурсию (за пределами регулярного выражения), чтобы найти все матчи. Вам нужно будет найти все совпадения верхнего уровня (добавить их в некоторый массив), а затем рекурсивно использовать одно и то же регулярное выражение для каждого из совпадений (добавив их все в один и тот же массив результатов) до тех пор, пока в итоге не будет найдено больше совпадений ,

В этом примере вы можете увидеть, что вам нужно будет снова запустить регулярное выражение на [b] hi [\b] hello, чтобы вернуть содержимое [b] hi [/b], которое равно hi.

Например, для ввода:

[A] outer [B] [C] last one left [/C] middle [/B] [/A] [A] out [B] in [/B] [/A] 

Прежде всего, запустить регулярное выражение против этой строки и посмотреть на группу 2 матча:

outer [B] [C] last one left [/C] middle [/B] 
out [B] in [/B] 

Добавить тех результирующего массива, то вы запускаете регулярное выражение против этих совпадений и получаете:

[C] last one left [/C] middle 
in 

Добавьте их в массив результатов и ag айн запустить его против этих матчей и получить:

last one left 
[no matches] 

И, наконец, вы бы запустить его против last one left и не получают больше матчей, так что вы сделали.

Raju, если вы не знакомы с рекурсией, было бы очень полезно прекратить чтение в этот момент и попытаться решить проблему самостоятельно - вернитесь, если вы сдаетесь. Тем не менее ...


решение Java, к этой проблеме: выход

public static void getAllMatches(Pattern p, String in, List<String> out) { 
    Matcher m = p.matcher(in);   // get matches in input 
    while (m.find()) {     // for each match 
    out.add(m.group(2));    // add match to result array 
    getAllMatches(p, m.group(2), out); // call function again with match as input 
    } 
} 

And here is a working example on ideone

ideone:

[A]outer[B][C]last one left[/C]middle[/B][/A] [A]out[B]in[/B][/A] 
----------- 
- outer[B][C]last one left[/C]middle[/B] 
- [C]last one left[/C]middle 
- last one left 
- out[B]in[/B] 
- in 

[quote]http://www.yourube.com?watch?v=asasdsadsa [url]aisa[/url] [/quote] 
----------- 
- http://www.yourube.com?watch?v=asasdsadsa [url]aisa[/url] 
- aisa 
+0

** Raju, я добавил рабочий код к моему ответу, однако, если вы совсем не знакомы с концепцией рекурсии, я настоятельно рекомендую вам сначала попытаться решить эту проблему! Это полезно, чтобы обернуть голову. ** – OGHaza

+0

Кажется, что использование рекурсии может облегчить обработку ошибок при рекурсивном сопоставлении регулярных выражений. Итак ... Если в моем сообщении есть какие-то произвольные строки (в любом случае, закрывающие теги bbocde), мне нужно построить регулярное выражение, чтобы разбить на две группы: одну для строк, вложенных в bbcode, одну для произвольных строк после тегов bbcode ? –

+0

Я не уверен, что вы имеете в виду, какова ваша конечная цель здесь? - добавьте его к вопросу, если долго объяснять, пример будет полезен. – OGHaza

0

Не совсем чистый способ, но не reg-ex way ...

int lastIndex = 0; 
String startString = "[quote]"; 
String endString = "[/quote]"; 
int start; 
int end; 
while (lastIndex != -1) { 
    start = string.indexOf(startString, lastIndex); 
    lastIndex = start; 
    if (lastIndex == -1) { 
     break; 
    } 
    end = string.indexOf(endString, lastIndex); 
    lastIndex = end; 
    if (lastIndex == -1) { 
     break; 
    } 
    System.out.println(string.substring(
     start + startString.length, 
     end + 1)); 
}