2010-05-21 55 views
2

在Java中,像foo <on> bar </on> thing <on> again</on> now一文中,我希望有一個正則表達式與組至極給我一個發現「富」,「酒吧」,空字符串,那麼「東西」,「再次」,「現在」。前瞻和組

如果我做(.*?)<on>(.*?)</on>(?!<on>),我只得到兩個組(富吧,再次,我還沒有結束「現在」)。

如果我做(.*?)<on>(.*?)</on>((?!<on>))我得到富巴空字符串,然後再的事情,空字符串(這裏我應該想「現在」)。

請什麼神奇公式?

謝謝。

+5

這看起來非常像XML。它實際上是* XML嗎?如果是這樣,請使用XML API而不是正則表達式。 – 2010-05-21 09:32:37

+0

你有問題嗎?你想用正則表達式來解決它?那麼,猜猜看是什麼? – Riduidel 2010-05-21 09:48:44

+0

空串來自哪裏? – polygenelubricants 2010-05-21 09:54:03

回答

0

我建議

  • 沒有必要<on>之前匹配文本後</on>
  • 使用非貪婪的標誌,以<on>和明年</on>
  • 之間的匹配文本使用循環與Matcher.find()測序通過所有事件,如果可能的話。沒有必要一次完成一個大的脂肪正則表達式!
+0

好吧,我這樣做。謝謝。 – Istao 2010-05-21 11:40:36

+0

好。您的程序將會更具可讀性和維護性。 – Ingo 2010-05-21 11:55:52

2

如果你堅持使用正則表達式這樣做,那麼你可以嘗試使用\s*<[^>]*>\s*作爲分隔符:

String text = "foo <on> bar </on> thing <on> again</on> now"; 
    String[] parts = text.split("\\s*<[^>]*>\\s*"); 
    System.out.println(java.util.Arrays.toString(parts)); 
    // "[foo, bar, thing, again, now]" 

我不知道這是否是你所需要的東西,因爲它是不完全清楚。


也許需要一個像這樣:

String text = "1<on>2</on>3<X>4</X>5<X>6</X>7<on>8</on><X>9</X>10"; 
    String[] parts = text.split("\\s*</?on>\\s*|<[^>]*>[^>]*>"); 
    System.out.println(java.util.Arrays.toString(parts)); 
    // prints "[1, 2, 3, 5, 7, 8, , 10]" 

這不處理嵌套的標籤。如果你有這些,你真的想轉儲正則表達式並使用一個實際的HTML解析器。

如果你不想在陣列中間的空字符串,那麼就(?:delimiter)+

String text = "1<on>2</on>3<X>4</X>5<X>6</X>7<on>8</on><X>9</X>10"; 
    String[] parts = text.split("(?:\\s*</?on>\\s*|<[^>]*>[^>]*>)+"); 
    System.out.println(java.util.Arrays.toString(parts)); 
    // prints "[1, 2, 3, 5, 7, 8, 10]" 
+0

沒有,對不起,我要趕只有,但例如不。 – Istao 2010-05-21 09:59:32

+0

@Istao:還不清楚。那麼爲什麼你需要'foo'和'thing'呢?用更多的例子編輯問題。 – polygenelubricants 2010-05-21 10:01:26