前瞻和小组

时间:2010-05-21 09:29:48

标签: java regex regex-lookarounds

在Java中,对于像foo <on> bar </on> thing <on> again</on> now这样的文本,我应该想要一个带有组的正则表达式,它给我一个查找“foo”,“bar”,空字符串,然后“thing”,“again”,“现在”。

如果我(.*?)<on>(.*?)</on>(?!<on>),我只会得到两个小组( foo bar,再次,而我现在还没有结束“)。

如果我(.*?)<on>(.*?)</on>((?!<on>))我得到 foo bar空字符串,然后再次出现空字符串(这里我想要“现在”)。

请问神奇的公式是什么?

感谢。

2 个答案:

答案 0 :(得分: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]"

答案 1 :(得分:0)

我的建议

  • 无需在<on>之前和</on>
  • 之后匹配文字
  • 使用非贪婪标记来匹配<on>和下一个</on>
  • 之间的文字
  • 如果可能,使用带Matcher.find()的循环对所有出现的顺序进行排序。没有必要一次性使用一个大的脂肪正则表达式!