Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用正则表达式解析字符串-可选捕获组_Javascript_Regex_Regex Group_Capture Group - Fatal编程技术网

Javascript 使用正则表达式解析字符串-可选捕获组

Javascript 使用正则表达式解析字符串-可选捕获组,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
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
    单词边界
  • (\d+)x?
    捕获组1,匹配1+个数字,然后匹配可选的
    x
  • [](\w+(?:\w+*)
    匹配一个空格,然后在第2组中捕获匹配的1+字字符,并对空格和1+字字符重复0+次
  • (?:
    非捕获组
    • []\(
      匹配空格和
    • ([^()]+)
      捕获组3,使用否定字符类不匹配
      ()
    • \)
      匹配
    • 匹配空格并在第4组中捕获匹配的1+位数
  • )?
    关闭非捕获组并将其设置为可选,因此组3和4是可选的
  • \b
    单词边界

您可以使用带有可选第二部分的模式作为a缩写和项目代码整数。您可以在一个捕获组中捕获的值提供了两个组和两个可选组

如果要匹配空白字符而不是只匹配空格,可以使用
\s

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

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

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

  • \b
    单词边界
  • (\d+)x?
    捕获组1,匹配1+个数字,然后匹配可选的
    x
  • [](\w+(?:\w+*)
    匹配一个空格,然后在第2组中捕获匹配的1+字字符,并对空格和1+字字符重复0+次
  • (?:
    非捕获组
    • []\(
      匹配空格和
    • ([^()]+)
      捕获组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代码。