正则表达式: 匹配多行直到某一行包含

24

我有以下字符串:

foo.a = [10
20
30
40];

foo.b = 'foobar';

我正在使用 foo\.[ab]\s*= 正则表达式

我试图匹配紧随其后的所有行,直到出现某个特定字符的行为止。

第一个匹配应该覆盖除最后一行以外的所有内容,因为那一行包含了一个等号。我尝试了很多带有(否定)预查的方法,但是我无法解决它。


1
分号是可选的。 - Simon Hänisch
2
foo\.[ab]\s*=[\S\s]*[=]+ 像这样?匹配应该在哪里停止? - Tacocat
3
尝试使用正则表达式(foo\.[a-zA-Z])\s*=\s*([^=]+?)(?=$|\n.*=) - Wiktor Stribiżew
2个回答

40

这个无法捕捉到第二个定义。 - Simon Hänisch
1
@simon 在这次惊人的编辑后,它确实做到了。更重要的是对于我的使用情况,如果我只想做标题中的内容:正则表达式:匹配多行直到一行包含foo [\ s \ S] *?(?= \ n .*?30),那么很容易进行修改。 - cregox
是的,最初它没有,但在编辑之后,我接受了这个作为正确答案,所以显然它能够完成任务。 - Simon Hänisch
有没有可能以某种方式将“30”作为一组匹配?我的意思是匹配在“[\s\S]*?”部分中的某个组。 - Karmalakas
@CRONUS 当然,最好从匹配的块中提取出来,再进行另一步操作。 - bobble bubble
没有其他步骤了。正在尝试弄清楚 PHP Storm 的 Ideolog 消息模式 :) - Karmalakas

6

变体 1

foo\.[ab]\s*=[\s\S]*?(?=foo\.[ab]\s*=)

使用正向前瞻匹配到另一个foo.a =foo.b =之前,它与您想要的内容相匹配。

演示:https://regex101.com/r/xV9wL4/2

变体2

(foo\.[ab]\s*=)[\s\S]*?(?=(?1))

这与上面的方法相同,但使用捕获组和对该捕获组的引用(通过(?1))来简化它。
演示:https://regex101.com/r/xV9wL4/3

1
两种变量都无法捕获第二个定义。 - Simon Hänisch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接