【问题标题】:Regex line matching with prefix与前缀匹配的正则表达式行
【发布时间】:2017-10-29 07:42:30
【问题描述】:

我目前正在开发一个 GitHub 挂钩,以在提交消息与某个字符串匹配时移动一些 Zenhub 问题位置。我想要实现的是:

Progress #121, #128, #50

我想在此处提取问题编号:121、128、50,并且该行必须具有 Progress 前缀。问题必须用逗号分隔,以 # 开头,并且可以有任意数量的前缀空格。

到目前为止我只做到了这一点

^(?:Progress)(?:\s*#(\d+),?)+$

这只会返回给我最后一个捕获组,这里是 50。

我想知道我哪里出了问题以及如何达到预期的结果。谢谢你。

编辑:我想使用正则表达式,因为我还想解决这些额外的情况:“进度”可以从字符串的中间开始,或者任何行的开头。如果“进度”从字符串的中间开始,那么我必须检查它后面的任何问题编号。

所以,如果有任何答案可以在 Python 中优雅地解决这个问题(除了 regex )也是受欢迎的。

【问题讨论】:

  • 你也需要#50吗?
  • 你想用JS还是python?
  • 不幸的是,JavaScript 和 Python 都不支持匹配继续锚点 \G,这会很容易:(?:^Progress\s+#|\G#)(\d+)(?:,\s+|$)
  • @TimPietzcker 这就是所谓的吗?谢谢!
  • @cᴏʟᴅsᴘᴇᴇᴅ:我不确定这是否是“官方”名称。

标签: python regex


【解决方案1】:

您正在使用正则表达式来匹配整个模式,并同时从中提取重复的子模式。我不确定你是否可以同时做这两个 - 要么是一个,要么是另一个。

如果您使用的是 Python,我建议您简化此操作。使用简单的str.startswith 检查,然后使用正则表达式提取问题编号。

if string.startswith('Progress'):
    return re.findall('#(\d+)', string)

应该返回['121', '128', '50']。如果您使用 JavaScript,则可以采用类似的方法。

【讨论】:

  • 谢谢,我曾想过这个解决方案,但我想使用正则表达式 我认为最好解决多种其他情况,例如:“进度”可以从字符串的中间开始,或者任何行的开头.如果“进度”从字符串的中间开始,那么我必须检查它后面的任何问题编号。
  • @SơnĐỗĐìnhThy 你可以这样做:如果字符串中的“进度”: .... 并重复同样的事情。为什么不呢?
  • @SơnĐỗĐìnhThy 如果您的问题得到解答,请accept the most helpful answer。谢谢。
猜你喜欢
  • 2020-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-16
  • 2013-08-26
  • 2014-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多