2013-07-22 26 views
2

我想在java中的空白處分割一個句子。但在文本中他們是html標籤,我不想在這裏分開這些詞。 因此,例如"hello <a>John Smith</a> hey ho"應分別爲:在空格中分割句子但不在html標記中

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

我想到了採用分體式,發現在JavaScript正則表達式,但我不能把它轉換成Java。
是否有更好的方法,然後使用正則表達式分割?

[編輯] 這裏是我可以轉換的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個獨立的組PS

  • 的HTML標記以結束標記<一個嗒嗒>嗒嗒</A>
  • 的HTML標記沒有結束標記< SCRIPT SRC = 「等等」/>
  • 文本的與運行沒有空白

如果HTML是正確的,並且HTML實體被正確轉義,那麼上面的正則表達式匹配器應該可以正常工作。即使在雜亂的HTML中,它也會很快且相當準確。

+0

謝謝它的工作正常!你能解釋「」在正則表達式? – user2170547

+0

@ user2170547 - 當然(? ...)是一個名爲「標記」的「命名匹配組」,它是「反向引用」的,這允許正則表達式匹配開放的A或DIV或SPAN與匹配的結束標記。當你將標籤嵌套在對方內時會出現。 –

+0

非常感謝,不知道:) – user2170547

3

所有我不建議正則表達式來分析任何形式的HTML,但首先,如果你堅持,這裏是你必須做的:

你必須首先匹配所有的HTML標籤,再拆上空間。正則表達式可以更容易地完成與你正在做的事情相反的過程。

這裏是一個活生生的例子:http://regex101.com/r/wX5hI4

希望這有助於。

編輯: 下面是從網站上提取生成的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)>)