使用 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
字边界
在我看来,样式 1 和样式 2 非常相似。
我会使用这个正则表达式来提取所有必要的组:
/(\d+).? ([\w ]*) ?(?>\((.*)\) (.*))?/
然后,您可以根据匹配组 3 和 4 的存在情况来确定它是样式 1 还是样式 2。
仅供参考,您可以使用非常有用的 regex101 来验证正则表达式:
https://regex101.com/r/0LYxdc/1
干杯
卢卡斯
我正在尝试解析和标记食谱。配料主要有两种写法:
样式 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
字边界
在我看来,样式 1 和样式 2 非常相似。 我会使用这个正则表达式来提取所有必要的组:
/(\d+).? ([\w ]*) ?(?>\((.*)\) (.*))?/
然后,您可以根据匹配组 3 和 4 的存在情况来确定它是样式 1 还是样式 2。
仅供参考,您可以使用非常有用的 regex101 来验证正则表达式: https://regex101.com/r/0LYxdc/1
干杯
卢卡斯