使用 Regex 解析字符串 - 可选的捕获组

Parse string with Regex - optional capture groups

我正在尝试解析和标记食谱。配料主要有两种写法:

样式 1

1 Ripe Avocado

1x Ripe Avocado - x 是可选的,有时会出现

或:

样式 2

1 Ripe Avocado (lrg) 123

1x Ripe Avocado (lrg) 123 - 如果出现缩写,则为项目代码整数

我正在尝试 a) 检测它是否匹配样式 1 或 2 和 b) 标记为以下捕获组.

[1][Ripe Avocado][lrg]?[123]?

我似乎无法始终如一地解析它,因此非常感谢您的帮助!

编辑:

^(\d+)x? ([a-zA-Z0-9_', -]+) 是我所拥有的,但它没有说明样式 2 中的可选捕获组。

您可以使用带有可选第二部分的模式作为缩写和项目代码整数。您可以在捕获组中捕获的值为您提供 2 个组和 2 个可选组。

如果你想匹配白色space字符而不是只匹配space,你可以使用\s代替。

假设这些是单词并且可以使用单词字符匹配 \w,您可以使用:

\b(\d+)x? (\w+(?: \w+)*)(?: \(([^()]+)\) (\d+))?\b

说明

(为了清楚起见,space 表示为 [ ]

  • \b 字边界
  • (\d+)x? 捕获第 1 组,匹配 1+ 个数字然后匹配可选 x
  • [ ](\w+(?: \w+)*)匹配一个space,然后在第2组中捕获匹配的1+个单词字符并重复0+次space和1+个单词字符
  • (?:非捕获组
    • [ ]\( 匹配 space 和 (
    • ([^()]+) 捕获组 3,不匹配 () 使用否定字符 class
    • \) 匹配 )
    • 匹配一个 space 并在第 4 组中捕获匹配 1+ 个数字
  • )? 关闭非捕获组并使其成为可选的,因此第 3 组和第 4 组是可选的
  • \b 字边界

Regex demo

在我看来,样式 1 和样式 2 非常相似。 我会使用这个正则表达式来提取所有必要的组:

/(\d+).? ([\w ]*) ?(?>\((.*)\) (.*))?/

然后,您可以根据匹配组 3 和 4 的存在情况来确定它是样式 1 还是样式 2。

仅供参考,您可以使用非常有用的 regex101 来验证正则表达式: https://regex101.com/r/0LYxdc/1

干杯

卢卡斯