【问题标题】:regular expressions for finding multi lines用于查找多行的正则表达式
【发布时间】:2021-09-10 09:13:04
【问题描述】:

全文:

def A
    pod 'Xyz', '0.1.0'
    pod 'zdb', '1.1.0+beta'
    pod 'Aero', '3.1.0'
end

def B
    A
    pod 'qq', '0.1.1'
    pod 'publ', '1.1.0'
end

我想要一个函数,输入值是'A'或'B',返回值是多行。 pod 名称的字符可以是任何字符。

例如,如果我输入'A',结果将是

pod 'Xyz', '0.1.0'
pod 'zdb', '1.1.0+beta'
pod 'Aero', '3.1.0'

如果我输入'B',结果将是

pod 'Xyz', '0.1.0'
pod 'zdb', '1.1.0+beta'
pod 'Aero', '3.1.0'
pod 'qq', '0.1.1'
pod 'publ', '1.1.0'

如何匹配此文本?

【问题讨论】:

  • 您真正想要实现什么?我的猜测是,您可能正在尝试在 Podfile 中定义多个目标,并且重复最少?
  • 我问这个,因为我觉得这像是一个潜在的 XY 问题:您在寻求解决方案的帮助,但没有说明最初的潜在问题。

标签: regex ruby


【解决方案1】:

可以使用正则表达式来完成。 我以前没有使用过 ruby​​,所以我将能够分享任何代码。我确实在网上查了几篇帖子来帮助我写答案。


正则表达式

"(?<=def [A-#{input}]\n)[^p]*(pod '.*?')(?=\nend)"gs

这里#{input} 是您的输入变量请注意,正则表达式必须在全局单行模式下应用(点匹配换行符)。你必须在红宝石中做到这一点。正如我已经提到的,我做不到。


输出

我尝试手动更改输入并针对您的输入字符串进行测试。

input 1:
A

match 1-group 1:
pod 'Xyz', '0.1.0'
    pod 'zdb', '1.1.0+beta'
    pod 'Aero', '3.1.0'


input 2:
B

match 1-group 1:
pod 'A-a', '0.1.0'
    pod 'A-b', '1.1.0'
    pod 'A-c', '3.1.0'

match 2-group 1:
pod 'B-a', '0.1.1'
    pod 'B-b', '1.1.0'

如你所见,如果全局应用group 1中会获得所有你感兴趣的行会额外加空格总是可以消除的。

测试链接:https://regex101.com/r/AljaZP/1

【讨论】:

  • 您的回答很好,但 pod 名称可能类似于“xyz123”,而不仅仅是“A-a”。对不起,我的例子没有说明它。
  • 您能否编辑答案以指定 pod 名称的格式?如果 pod 名称不包含 A、B 等 (这是我们将匹配锚定的地方),则上述正则表达式将不起作用。
  • @jseanj 我已经编辑了我的答案。它并不完美,但它确实捕捉到了你想要的。
猜你喜欢
  • 2020-06-03
  • 1970-01-01
  • 1970-01-01
  • 2015-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多