Javascript 使用正则表达式解析字符串-可选捕获组
我正在尝试解析和标记食谱。成分可以用两种主要方式书写: 风格1Javascript 使用正则表达式解析字符串-可选捕获组,javascript,regex,regex-group,capture-group,Javascript,Regex,Regex Group,Capture Group,我正在尝试解析和标记食谱。成分可以用两种主要方式书写: 风格1 1熟鳄梨 1x熟鳄梨-x是可选的,有时会出现 或: 风格2 1成熟鳄梨(lrg)123 1x熟鳄梨(lrg)123-如果缩写词是项目代码整数 我试图a)检测它是否与样式1或2匹配,b)标记为以下捕获组 [1][熟透的鳄梨][lrg]?[123]? 我似乎无法始终如一地解析这一点,因此任何帮助都将不胜感激 编辑: ^(\d+)x?([a-zA-Z0-9_',-]+)是我所拥有的,但它没有考虑到样式2中可选的捕获组。您可以使用一个模式,
1熟鳄梨
1x熟鳄梨
-x
是可选的,有时会出现
或:
风格2
1成熟鳄梨(lrg)123
1x熟鳄梨(lrg)123
-如果缩写词是项目代码整数
我试图a)检测它是否与样式1或2匹配,b)标记为以下捕获组
[1][熟透的鳄梨][lrg]?[123]?
我似乎无法始终如一地解析这一点,因此任何帮助都将不胜感激
编辑:
^(\d+)x?([a-zA-Z0-9_',-]+)
是我所拥有的,但它没有考虑到样式2中可选的捕获组。您可以使用一个模式,该模式带有可选的第二部分作为a缩写和项目代码整数。您可以在一个捕获组中捕获的值提供了两个组和两个可选组
如果要匹配空白字符而不是只匹配空格,可以使用\s
假设这些是单词,并且可以使用单词字符进行匹配,则可以使用:
\b(\d+)x? (\w+(?: \w+)*)(?: \(([^()]+)\) (\d+))?\b
解释
(为清晰起见,空格表示为[]
)
单词边界\b
捕获组1,匹配1+个数字,然后匹配可选的(\d+)x?
x
匹配一个空格,然后在第2组中捕获匹配的1+字字符,并对空格和1+字字符重复0+次[](\w+(?:\w+*)
非捕获组(?:
匹配空格和[]\(
(
捕获组3,使用否定字符类不匹配([^()]+)
()
匹配\)
)
- 匹配空格并在第4组中捕获匹配的1+位数
关闭非捕获组并将其设置为可选,因此组3和4是可选的)?
单词边界\b
您可以使用带有可选第二部分的模式作为a缩写和项目代码整数。您可以在一个捕获组中捕获的值提供了两个组和两个可选组 如果要匹配空白字符而不是只匹配空格,可以使用
\s
假设这些是单词,并且可以使用单词字符进行匹配,则可以使用:
\b(\d+)x? (\w+(?: \w+)*)(?: \(([^()]+)\) (\d+))?\b
解释
(为清晰起见,空格表示为[]
)
单词边界\b
捕获组1,匹配1+个数字,然后匹配可选的(\d+)x?
x
匹配一个空格,然后在第2组中捕获匹配的1+字字符,并对空格和1+字字符重复0+次[](\w+(?:\w+*)
非捕获组(?:
匹配空格和[]\(
(
捕获组3,使用否定字符类不匹配([^()]+)
()
匹配\)
)
- 匹配空格并在第4组中捕获匹配的1+位数
关闭非捕获组并将其设置为可选,因此组3和4是可选的)?
单词边界\b
在我看来,样式1和样式2非常相似。 我将使用此正则表达式提取所有必要的组:
/(\d+).? ([\w ]*) ?(?>\((.*)\) (.*))?/
然后,您可以根据匹配组3和4的存在来确定是样式1还是样式2
仅供参考,您可以使用非常有用的regex101验证regexp:
干杯
卢卡斯在我看来,风格1和风格2非常相似。 我将使用此正则表达式提取所有必要的组:
/(\d+).? ([\w ]*) ?(?>\((.*)\) (.*))?/
然后,您可以根据匹配组3和4的存在来确定是样式1还是样式2
仅供参考,您可以使用非常有用的regex101验证regexp:
干杯
Lucas你真的在正则表达式中使用了
[]
?这是用于定义字符类,而不是组。另外,(?:)
将是一个非捕获组,而不是可选组。请共享您正在尝试的正则表达式,好吗?据我所知,您可能需要类似以下内容:(\d)x?\s(\w*)(\s(lrg)\(\d*))?@VLAZ-抱歉,这只是显示我理想结果的psuedo代码。您真的在正则表达式中使用了[]
?这是用于定义字符类,而不是组。另外,(?:)
将是一个非捕获组,而不是可选组。请共享您正在尝试的正则表达式,好吗?据我所知,您可能需要类似以下内容:(\d)x?\s(\w*)(\s(lrg)\(\d*))?@VLAZ-抱歉,这只是显示我理想结果的psuedo代码。