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

时间:2019-06-24 11:39:39

标签: javascript regex regex-group capture-group optional-capture-group

我正在尝试解析和标记配方。成分可以通过两种主要方式书写:

样式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 个答案:

答案 0 :(得分:2)

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

如果要匹配空格字符而不是仅匹配空格,则可以改用variant1

假设这些是单词,并且可以使用单词\s进行匹配,则可以使用:

\w

说明

(为清楚起见,空格标记为\b(\d+)x? (\w+(?: \w+)*)(?: \(([^()]+)\) (\d+))?\b

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

Regex demo

答案 1 :(得分:2)

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

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

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

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

欢呼

卢卡斯