前瞻和分组

发布于 2024-09-02 13:07:31 字数 409 浏览 3 评论 0原文

在 Java 中,在像 foo这样的文本上栏事情<开>再次现在,我应该想要一个带有组的正则表达式,它给我一个查找“foo”,“bar”,空字符串,然后是“thing”,“again”,“now”。

如果我执行 (.*?)(.*?)(?!),我只得到两个组 (foo bar,事情又来了,而且我还没有“现在”结束)。

如果我这样做 (.*?)(.*?)((?!)) 我得到 foo bar 空字符串,然后再次出现并空字符串(这里我应该想要“现在”)。

请问有什么神奇的公式吗?

谢谢。

In Java, on a text like foo <on> bar </on> thing <on> again</on> now, I should want a regex with groups wich give me with a find "foo", "bar", empty string, then "thing", "again", "now".

If I do (.*?)<on>(.*?)</on>(?!<on>), I get only two group (foo bar, thing again, and I've not the end "now").

if I do (.*?)<on>(.*?)</on>((?!<on>)) I get foo bar empty string, then thing again and empty string (here I should want "now").

Please what is the magical formula ?

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

も星光 2024-09-09 13:07:31

如果您坚持使用正则表达式执行此操作,那么您可以尝试使用 \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]"

If you insist on doing this with regex, then you can try to use \s*<[^>]*>\s* as delimiter:

    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]"

I'm not sure if this is exactly what you need, because it's not exactly clear.


Perhaps something like this was required:

    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]"

This doesn't handle nested tags. If you have those, you'd really want to dump regex and use an actual HTML parser.

If you don't want the empty string in the middle of the array, then just (?: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]"
触ぅ动初心 2024-09-09 13:07:31

我的建议

  • 是,无需在 之前和 之后匹配文本,
  • 使用非贪婪标志来匹配 之间的文本。 和下一个
  • 使用带有 Matcher.find() 的循环来对所有出现的情况进行排序(如果可能)。无需使用一个庞大的正则表达式一次性完成所有操作!

My recommendations

  • there is no need to match text before <on> and after </on>
  • use non greedy flags to match text between <on> and next </on>
  • use a loop with Matcher.find() to sequence through all occurences, if possible. No need to do all at once with one big fat regexp!
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文