【问题标题】:Parse string with Regex - optional capture groups使用正则表达式解析字符串 - 可选捕获组
【发布时间】:2019-11-06 05:06:24
【问题描述】:

我正在尝试解析和标记食谱。成分可以用两种主要方式编写:

样式 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 中的可选捕获组。

【问题讨论】:

  • 你真的在你的正则表达式中使用[]吗?这是为了定义字符类,而不是组。
  • 另外(?:) 将是一个非捕获组,而不是一个可选组。
  • 你能分享一下你正在尝试的正则表达式吗?据我了解,您可能需要类似: (\d)x?\s(\w.*)(\s(lrg)\ (\d.*))?
  • @VLAZ - 抱歉,这只是显示我理想结果的伪代码。

标签: javascript regex regex-group capture-group


【解决方案1】:

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

如果您想匹配空白字符而不是只匹配空格,您可以使用 \s 代替。

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

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

说明

(为清楚起见,空格表示为[ ]

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

Regex demo

【讨论】:

    【解决方案2】:

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

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

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

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

    干杯

    卢卡斯

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-11
      • 1970-01-01
      • 2016-12-15
      • 1970-01-01
      • 1970-01-01
      • 2021-10-05
      • 1970-01-01
      相关资源
      最近更新 更多