2010-05-21 59 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