RegExp 在某个字符串后停止匹配

RegExp to stop matching after a certain string

我正在寻找一个 RegExp 在某个 关键字 之后停止匹配。

这是我的输入:
blabl

文本 1,40
textb 3.50
textc 6,90

blabal 2 3
ddd 3 jj d

key textd textf
2,30 4,70 5,90

我要匹配的是:
blabl

texta 1,40
textb 3.50
textc 6,90

blabal 2 3
ddd 3 jj d

key textd textf
2,30 4,70 5,90

我的正则表达式目前是什么样子
[\d]{1,2}[.,][\d]{2}

我尝试解决的问题
[\d]{1,2}[.,][\d]{2}(?=key)

所以我在寻找这样的东西:
(我要匹配的)(任何)(关键字)

我尝试了以下正则表达式:
([\d]{1,2}[.,][\d]{2}(.|\n)+(?=key))
但现在它匹配:

texta 1,40
textb 3.50
textc 6,90

blabal 2 3
ddd 3 jj d

key textd textf
2,30 4,70 5,90

我阅读了有关非捕获组的信息,这似乎解决了我的问题。所以我尝试了:
([\d]{1,2}[.,][\d]{2}(?>(.|\n)+)(?=key))
但这根本不匹配。

我觉得我快到了,但我真的需要一些帮助。任何我缺少的想法都会受到赞赏。如果您对我的问题有任何疑问,请不要犹豫。

提前感谢您的时间和精力。

您可以使用

/\d+[,.]\d+(?=[\s\S]*key)/g

参见regex demo

详情

  • \d+ - 1+ 位数
  • [,.] - 一个 ,.
  • \d+ - 1+ 位数
  • (?=[\s\S]*key) - 一个积极的前瞻,需要任何 0+ 个字符后跟一个词 key 在最后 1+ 个数字匹配后紧跟在右边。

JS 演示:

var s = "blabl\n\ntexta 1,40\ntextb 3.50\ntextc 6,90\n\nblabal 2 3\nddd 3 jj d \n\nkey textd textf\n2,30 4,70 5,90";
var rx = /\d+[,.]\d+(?=[\s\S]*key)/g;
console.log(s.match(rx));