【问题标题】:Can this do-able using regular expressions patterns (capture groups)?这可以使用正则表达式模式(捕获组)吗?
【发布时间】:2021-08-11 06:12:23
【问题描述】:

在 JS 中,我有一组字符串需要分解成一个数组。每个字符串最多可以分解为 5 个组(有些组更少)。我正在使用正则表达式来打破一切。

在下面的字符串集中,如果它包含aabbcc,则需要进入捕获组2。

不幸的是,我对正则表达式不是很熟悉,因此卡在了这一点上。

这种模式是否只能使用正则表达式,还是我必须将 :: 打破到 | 并在以后分解?

我的正则表达式模式^[ \t]*(?:(?:(\w+)\|)?(?:(\w+):(?:(\w+):)?)?)?(\w+)::(\w+)$ DEMO

字符串集(每行在 JS 中循环运行):

                 group4::group5
              aa:group4::group5
              bb:group4::group5
              cc:group4::group5
          group1|group4::group5
       group1|aa:group4::group5

          group3:group4::group5
       aa:group3:group4::group5
   group1|group3:group4::group5
group1|aa:group3:group4::group5

最终结果应该可以产生这个……

var groups = {1:"group1", 2:"group2", 3:"group3", 4:"group4", 5:"group5"};

如果有人可以帮助我,正则表达式模式就足够了

【问题讨论】:

  • |: 的工作方式有什么特别之处吗?
  • 总是 group5, group4 存在。 | 用于分隔特殊内容的字符,但是,如果该模式不可能,则可以用 : 替换(如果有帮助的话)。
  • 我相信最有效和可能的方法是捕获整个组并检查 3 个值并命名它们。所以这也是一个选择。我不太擅长正则表达式。这就是我坚持这一点的原因。
  • 或许不使用正则表达式会更好?
  • group2:group4::group5 中,为什么group2 不应该被捕获在#3 组中?为什么和group3:group4::group5不同?

标签: javascript regex regex-group


【解决方案1】:

您可以使用这个 PCRE 正则表达式,包括一个分支重置组、5 个单独的捕获组、几个可选匹配项和非捕获组:

^\h*(?:(?:(\w+)\|)?(?|(?:(aa|bb|cc):(?:(\w+):)?)|(?:((?2)):)?(\w+):)?)?(\w+)::(\w+)$

Updated RegEx Demo

PS:分支重置组在 Javascript 中不起作用。

【讨论】:

  • group3:group4::group5group1|group3:group4::group5 在此模式上没有正确匹配。
  • 澄清group3:group4::group5group2:group4::group5 的大小写。为什么它们应该不同?
  • 我刚刚更新了问题 NEW DEMO:regex101.com/r/jFPbsQ/1
  • 太棒了!有效 !!!呜呜……非常感谢。你真是个天才。我总是不擅长正则表达式模式。
  • 在 JS 中是可能的,但组号会有所不同。只需将(?| 替换为(?:
猜你喜欢
  • 2022-01-08
  • 2015-03-21
  • 2012-08-28
  • 1970-01-01
  • 2017-12-30
  • 1970-01-01
  • 2022-11-21
  • 2017-01-17
相关资源
最近更新 更多