2

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

如果我这样做(.*?)<on>(.*?)</on>(?!<on>)了,我只会得到两组(foo bar,又一次,而且我还没有结束“现在”)。

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

请问神奇的公式是什么?

谢谢。

4

2 回答 2

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]"
于 2010-05-21T09:55:54.020 回答
0

我的建议

  • 无需前后匹配<on>文本</on>
  • 使用非贪婪标志来匹配<on>和下一个之间的文本</on>
  • 如果可能,使用 with 循环Matcher.find()对所有事件进行排序。无需使用一个大的正则表达式一次完成所有操作!
于 2010-05-21T09:55:24.490 回答