我正在尝试解析和标记配方。成分可以通过两种主要方式书写:
1 Ripe Avocado
1x Ripe Avocado
-x
是可选的,有时是
或:
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中的可选捕获组。
答案 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组,但使用否定的字符类不匹配([^()]+)
()
匹配\)
)
关闭非捕获组并将其设置为可选,以便组3和4为可选)?
字边界答案 1 :(得分:2)
在我看来,样式1和样式2非常相似。 我将使用此正则表达式提取所有必要的组:
/(\d+).? ([\w ]*) ?(?>\((.*)\) (.*))?/
然后,您可以根据匹配组3和4的存在来确定它是样式1还是样式2。
仅供参考,您可以使用非常有用的 regex101 来验证正则表达式: https://regex101.com/r/0LYxdc/1
欢呼
卢卡斯