2013-07-22 1 views
2

Я хочу разделить senctence на пробелы в java. Но в тексте они html-теги, и я не хочу разбить слова здесь. Так, например "hello <a>John Smith</a> hey ho" должны быть разделены как:Разделение предложений в пробелах, но не в html-тегах

hello 
<a>John Smith</a> 
hey 
ho 

Я думал об использовании раскола и нашел регулярное выражение в JavaScript, но я не мог преобразовать его в Java.
Может быть, лучший способ использования split с регулярным выражением?

[Изменить] Вот регек javascript, который я мог бы преобразовать, но мне интересно, есть ли лучший способ, чем регулярное выражение? https://stackoverflow.com/a/7552371/2170547

+3

java или javascript? – assylias

+0

Вы должны предоставить JS-регулярное выражение и предоставить то, что вы пытались преобразовать, добавив некоторый Java-код, будет лучшим. Преобразование JS-регулярного выражения в Java должно быть довольно простым. – HamZa

+1

Что касается предложений, заключенных в теги HTML, например. ' hello John Smith hey ho'? – Thomas

ответ

1

Вот некоторые фактические рабочий код Java7 http://ideone.com/PWv56h

class Main 
{ 
    public static void main (String[] args) throws java.lang.Exception 
    { 
    String test = "testing 1 2 3 <a title=\"a demo\" href=\"\">testing 4 5 6</a> testing\t7\n8\r9 <br /><script src=\"blah\" />more text"; 
    java.util.regex.Matcher m = java.util.regex.Pattern.compile("(<(?<tag>[A-Za-z]+)[^>]*?>[^<]*</\\k<tag>>)|(<[A-Za-z]+[^>]*?/>)|([^\\p{Space}]+)").matcher(test); 
    while(m.find()) 
     System.out.println(m.group()); 
    } 
} 

Регулярное выражение соответствует 3 отдельным grou пс

  • HTML-тег с закрывающим тегом < ла> ла </а>
  • HTML-тег не закрывающий тег < сценарий SRC = «л» />
  • Заурядного текст с нет пробелов в нем

Если HTML-код является правильным и HTML-объекты экранированы правильно, вышеупомянутый помощник регулярного выражения должен хорошо работать. Даже в грязном HTML это будет быстро и довольно точно.

+0

, спасибо, что он работает нормально! Можете ли вы объяснить «» в регулярном выражении? – user2170547

+0

@ user2170547 - Sure (? ...) является «именованной группой соответствия», которая называется «тегом», она «обратная ссылка» с \\ k , это позволяет регулярному выражению соответствовать открытию A или DIV или SPAN с соответствующим совпадающим тегом. возникают, когда у вас есть теги, вложенные друг в друга. –

+0

большое спасибо, не знал, что :) – user2170547

3

Прежде всего, я не рекомендую регулярное выражение для разбора любой формы HTML, но если вы настаиваете, вот что вы должны сделать:

Вы должны сначала соответствовать всем HTML-теги, а затем разделить на пространство. В regex проще сделать обратное тому, что вы пытаетесь сделать.

Вот живой пример: http://regex101.com/r/wX5hI4

Надеется, что это помогает.

Edit: Вот сгенерированный Java-код извлекается из сайта:

String re = "(<a>.*?</a>)\\s*| "; 
String str = "hello <a>John Smith</a> hey ho"; 

Pattern p = Pattern.compile(re); 
Matcher m = p.matcher(str); 
+0

+1, но регулярное выражение должно использовать '. *' Внутри '<>', чтобы другие теги работали. –

+0

1+ для совместного использования regex101.com. что сайт болен – Brad

+0

Я тестировал его, и он не работает в java :( – user2170547

0

попробовать это ... DEMO

(?<=</(a)>)|(?=<(a)>) 
Смежные вопросы