【问题标题】:combining multiple regex groups with lookahead将多个正则表达式组与前瞻组合
【发布时间】:2016-12-03 11:46:52
【问题描述】:

如果可能的话,如何将 3 种正则表达式模式组合成 1 个表达式?
我想获得第一个 th 标签值 first td 标签 valueid 来自 a 标记,为此使用适当的正则表达式。我已经努力了一个小时才能将它们全部放在一个表达式中。解决方案是什么?

 regex for th tag:  
 th[^>]+l">([^<]+)</th  
 regex for td tag:  
 td>([^<]+)</td  
 regex for a tag:
 <a((?!</a).)id="([^"]+)" 

我有一个类似 sn-p 的项目列表。

    ...
    <th scope="col">1X2</th>
    <th scope="col" class="goR">Odds</th>
    </tr></thead>
    <tbody>
    <tr class="row1">
    <td>Fortuna Köln</td>
    <td class="prc "><label><a id="MarketGroupListComponent25-selection-38225206.1" />
    ...

【问题讨论】:

  • 一个合适的 html 解析库怎么样,它可以为您提供更简单的提取可能性,例如:jsoup.org/cookbook/extracting-data/selector-syntax - 如果有人在 html 表中添加评论,您的正则表达式就会搞砸
  • 感谢您的建议,我一定会检查一下!
  • @zapl 如果没有正确编写 html,例如使用非封闭的 p 标签,您的解析器就会出错。解析器可能是最好的解决方案,但并不总是最好的解决方案。

标签: java regex regex-greedy


【解决方案1】:

这是一个可能的解决方案:

(?s)th[^>]+l">(.*?)<\/th>.*?<td>(.*?)<\/td>.*?<a id="(.*?)"

您需要 (?s) 修饰符来使 . 匹配换行符。 所需的 3 个字符串位于第 1、2 和 3 组中。

在这种情况下,您不需要任何前瞻。

查看action

注意:

这个正则表达式会在许多奇怪的情况下失败,例如在 id 或包含 thth 的值中转义了 \"。 如果您知道 html 是有效的,您可以使用 Java HTML parser 进行更复杂的查询。如果 html 无效或 html 结构已更改,此解析器也可能会失败。

【讨论】:

  • 对否决票有何评论?这个问题问了一个正则表达式,我给了一个正则表达式。根据文件格式的可变性,正则表达式可能是一个好主意,解析器可能是一个更好的主意。
猜你喜欢
  • 2016-12-08
  • 1970-01-01
  • 2011-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-13
  • 1970-01-01
相关资源
最近更新 更多