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

Sim*_*sch 6 regex

我有以下字符串:

foo.a = [10
20
30
40];

foo.b = 'foobar';
Run Code Online (Sandbox Code Playgroud)

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

我尝试匹配后面的所有行,直到一行包含某个字符.

第一个匹配应覆盖除最后一行之外的所有内容,因为该行包含等号.我尝试了很多(负面的)前瞻性的东西,但我无法弄明白.

bob*_*ble 11

你需要一个积极的前瞻.

foo\.[ab][\s\S]*?(?=\n.*?=|$)
Run Code Online (Sandbox Code Playgroud)
  • [\s\S]*?懒惰地匹配任何角色
  • (?=\n.*?=|$)直到包含a的换行符在=前面或$后面.

请参阅regex101上的演示


Red*_*ser 6

变化1

foo\.[ab]\s*=[\s\S]*?(?=foo\.[ab]\s*=)
Run Code Online (Sandbox Code Playgroud)

它匹配您想要的直到另一个foo.a =foo.b =使用积极的前瞻。

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

变化2

(foo\.[ab]\s*=)[\s\S]*?(?=(?1))
Run Code Online (Sandbox Code Playgroud)

这与上面的工作方式相同,但使用捕获组和对该捕获组的引用(通过(?1))来简化它

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