gpt4 book ai didi

Java RegEx 组 StackOverflow

转载 作者:行者123 更新时间:2023-12-02 06:21:55 24 4
gpt4 key购买 nike

我目前正在尝试使用 RegEx 在 Java 中解析一些 HTML。在实时代码的较小测试样本上它可以工作,但是当针对实时代码尝试它时,正则表达式引擎会破坏堆栈。

这是我正在使用的代码和正则表达式。

/**
* RegEx Explanation:
* "(?i)" - Turn on case insensitive mode
* "<BR><BR><B>.+?</B><BR>" - Match the format for a group name
* "(?-i)" - Turn off case insensitive mode
* "(.|\\r|\\n)" - Match all the text following the group name incl. newlines
* "(?=((?i)<BR><BR><B>.+?</B><BR>(?-i))" - and lookahead for the start of a new group, make the match lazy and use case-insensitive mode
* "+?)" - Make the lookahead lazy, close out the capture group.
*/
Pattern filterPattern =
Pattern.compile("(?i)(<BR><BR><B>.+?</B><BR>)(?-i)(.|\\r|\\n)+?(?=((?i)<BR><BR><B>.+?</B><BR>(?-i))+?)");
Matcher match = filterPattern.matcher(content);

ArrayList<String> groups = new ArrayList<String>();
// Retrieve the matches found by the RegEx
while(match.find()) {
if(match.groupCount() > -1) {
groups.add(match.group(0));
}
}

实时html是一个板列表( http://menu.2ch.net/bbsmenu.html ),但一般格式是:

<br><br><b>Group name</b><br>
<a href="board url">Name of the board</a><br>

此操作会使用不同数量的链接重复多次。我避免使用像 JSoup 这样的常规 HTML 解析器,只是因为格式一致并且更容易在第一遍提取部分时使用 RegEx 进行定位。

调用 group() 时发生堆栈溢出。其他问题指出,这是由于 Java 中的 group() 调用没有递归深度限制,因此它将运行直到达到堆栈限制。我不太擅长正则表达式,这可能就是为什么我错过了一个可能更简单的表达式。我怀疑递归问题发生在交替(.|\r|\n)处,但由于组太多,它也可能很容易发生。我不知道。

有没有更好的表达方式来避免灾难性的递归?

最佳答案

正如他们在评论中所说,使用可以通过 XPath 或类似方式访问 DOM 的解析器!

为了帮助您使用正则表达式,请考虑(这些都没有经过测试,仅凭内存):

(?is)(?:<BR><BR><B>(.+?)</B><BR>)(.*?)(?=<BR><BR><B>.+?</B><BR>)

(?i)(?:<BR><BR><B>(.+?)</B><BR>)\s*((?:<A HREF=.*?>.*?</A><BR>\s*)+)
  • ((?i)blah(?-i))很难阅读,请使用 (?i:blah)相反,它就是这样设计的,或者只使用一个 (?i) ,因为您无论如何都不希望在正则表达式中出现任何特定的区分大小写的情况
  • 如果您开启 DOTALL 模式,你可以写.*?它会匹配 "hello\n\r\tworld"也是如此。
  • 关于(.|\\r|\\n)+?和前瞻:你不需要重复下一个标题,你只是寻找下一个标题的存在
  • 您可以使用group(1)group(2)如果您使用非捕获组,则分别查找标题和链接:(?:I'm not a numbered group) .
  • 如果格式一致,您可以表达它而不是使用 (.|\\r|\\n)+? :<A HREF=(.*?)>(.*?)</A><br>\n
  • 我给出的第一个选项可能会在最后一个类别中中断,但我认为您的也是如此,因为您正在使用 +? ,也许是(?=...)?使其成为可选匹配,但我不确定它是否有效。使用第二个选项,这更重要!

关于Java RegEx 组 StackOverflow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20933454/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com