一个跟随或者紧接在另一个捕获组之前的正则表达式捕获组。

4

我正在尝试创建一个捕获组,该组可以在另一个捕获组之前或之后出现。

给定:

TAKE 4 MG BY MOUTH
INHALE 14 PUFFS
4 PUFFS INHALE

职位需求:

qty unit  rte
--- ----  ---
4   MG    BY MOUTH
14  PUFFS INHALE
4   PUFFS INHALE

我的尝试,(?:(?'qty'\d+)\s(?'unit'(PUFFS|MG))).*(?'rte'(BY MOUTH|INHALE)),仅在rte跟随qty/unit组时起作用。这个概念叫什么?是"look-around"吗?

例如:https://regex101.com/r/IRTYgU/1

2个回答

3

您可以使用

^(?=.*(?'rte'BY MOUTH|INHALE)).*\b(?'qty'\d+)\s(?'unit'PUFFS|MG)

请查看正则表达式演示

详细信息:

  • ^ - 字符串的开头
  • (?=.*(?'rte'BY MOUTH|INHALE)) - 在除换行符之外的任意零个或多个字符之后,必须有 BY MOUTH 或者 INHALE(Group "rte")
  • .* - 除换行符之外的任意零个或多个字符
  • \b - 单词边界(用于匹配完整数字)
  • (?'qty'\d+) - Group "qty": 一个或多个数字
  • \s - 空格
  • (?'unit'PUFFS|MG) - Group "unit": PUFFSMG

3

您可以使用带有捕获组的前瞻正则表达式:

^(?=.*\b(?'rte'BY MOUTH|INHALE))(?:\w+\s+)?(?'qty'\d+)\s+(?'unit'PUFFS|MG)

正则表达式演示

拆解:

  • ^: 开始
  • (?=.*\b(?'rte'BY MOUTH|INHALE)): 正向前瞻,确保行中包含 BY MOUTHINHALE 并且我们将其捕获在组名为rte的捕获组中。
  • (?:\w+\s+)?: 可选匹配一个单词后跟1个或多个空格
  • (?'qty'\d+): 用于捕获1个或多个数字的捕获组qty
  • \s+: 匹配1个或多个空格
  • (?'unit'PUFFS|MG): 用于捕获PUFFSMG的捕获组unit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接