【问题标题】:Regex to extract text between brackets正则表达式提取括号之间的文本
【发布时间】:2021-09-08 16:20:51
【问题描述】:

我需要在这段 HTML 代码中提取括号中的数字 5:

<td class="th-clr-cel th-clr-td th-clr-pad th-clr-cel-dis" style="width:226px; text-align:left; ">
<span class="th-tx th-tx-value th-tx-nowrap"  style="width:100&#x25;; "  title="Social&#x20;Insurance&#x20;Number&#x20;&#x28;SIN&#x29;" id="C29_W120_V121_builidnumber_table[5].type_text" f2="C;40">
    Social&#x20;Insurance&#x20;Number&#x20;&#x28;SIN&#x29;
</span>

这只是整个 HTML 代码的摘录,在此示例之前和之后还有更多实际代码。但有一点是肯定的,“保险”这个词只出现在这个样本中。

我设法用这个正则表达式匹配“社会保险号”的两个实例之间的任何内容:

((?<=Social&#x20;Insurance&#x20;Number)(.*)(?=Social&#x20;Insurance&#x20;Number))

现在我需要将它组合起来并提取方括号中的数字 5。

请注意:括号的内容可以是多个字符(即:15),但它始终是数字。

谢谢

编辑:我想使用正则表达式解析 HTML 的原因是因为这是 JMeter 脚本的一部分,用于在具有数百个并发用户的系统上运行大规模性能测试。性能是这里的一个主要因素,XML 解析器将比正则表达式消耗更多的资源。

【问题讨论】:

  • 具体问题是什么?其他字符中包含的数字的正则表达式?您确定通过解析 HTML 不会更容易吗?
  • .*\[(\d+)\].* 对你有用还是我错过了什么?
  • 就像我说的,我在此处发布的示例前后会有大量代码。所以会有很多其他的括号和数字。我需要提取出现在“保险”一词的两个实例之间的那个
  • 我感觉这句话已经说了一百万遍了,但是不要使用 Regex 来解析 HTML

标签: regex


【解决方案1】:

这将准确捕获方括号内由术语保险包围的数字:

Insurance(?:[\s\S]*)\[(\d+)\](?:[\s\S]*)Insurance

演示:https://regex101.com/r/hwFB0Y/3

【讨论】:

  • 由于交替使用(?:.|\n)* 有点低效。您可以改用[\s\S]*,或者如果支持使用内联修饰符(?s),让点匹配换行符。 Javascript 支持[^]*
  • 谢谢@Thefourthbird!!仅因为像您这样的人,才发现这个平台最好。学习++
  • 在字符类中,| 不是 OR,而是匹配一个管道字符。但是[\s|\S]* 是不必要的,因为\s\S 已经匹配了包括管道在内的所有内容:-)
  • 再次感谢您!!你解决了我的一些疑虑。
  • 谢谢你们!另一个很好的解决方案。我会把它标记为答案,但另一个是在这个之前发布的。
【解决方案2】:

试试这个:

Insurance.*\[(\d+)\]

或者,如果您想在 2 个“保险”字词之间进行匹配

Insurance.*\[(\d+)\][\s\S]+?Insurance

Demo here.

在哪里

  • Insurance - 匹配起始词“保险”
  • .* - 匹配任意字符
  • \[ - 匹配左括号
  • (\d+) - 捕获括号内的数值
  • \] - 匹配右括号
  • [\s\S]+? - 以非贪婪的方式匹配任何字符(包括换行符),这样它就不会跨越多个“保险”字词
  • Insurance - 匹配结尾词“保险”

【讨论】:

  • 完美!太感谢了。这很干净
【解决方案3】:

这就是你要找的吗?

((?<=Social&#x20;Insurance&#x20;Number.*\[)(\d+)(?=\].*Social&#x20;Insurance&#x20;Number))

【讨论】:

  • 我在 regex101.com 上测试它时出现错误
  • 一些正则表达式引擎支持非固定的lookbehinds。
最近更新 更多