如何在比赛前获得第一个匹配单词

时间:2017-02-15 18:51:41

标签: javascript regex node.js

我有一个需要分隔的大文本。

STARTING
....
TEXT
....
END
STARTING
....
TEXT
....
END

我想要分隔的所有e开头和结尾都是相同的字符。但我只想在开始和结束之间获取文本,ID: 10出现。样品:

STARTING
....
TEXT
....
END
STARTING
....
TEXT
ID: 10
....
END

欲望结果:

STARTING
....
TEXT
ID: 10
....
END

所以,我做了这个正则表达式:

START[\s\S]*?ID:\s15[\s\S]*?END

http://regexr.com/3fa8s

问题是:匹配是在获取文本之前,应该得到:

START
ID: 15
END

获得:

START
ID: 13
END
START
ID: 15
END

是否可以在比赛前获得第一个START

谢谢!

2 个答案:

答案 0 :(得分:0)

"回火"带有[\s\S]前瞻的(?!START)模式:

START(?:(?!START)[\s\S])*?ID:\s15[\s\S]*?END

请参阅regex demo

(?:(?!START)[\s\S])*?将匹配任何字符([\s\S]),0或更多次出现,但尽可能少,但未启动START序列。

懒惰的*?量词可以变成贪婪的量词,但是你需要在前瞻中添加更多的替代词:

START(?:(?!START|END|ID:\s15)[\s\S])*ID:\s15[\s\S]*?END

请参阅another regex demo

答案 1 :(得分:0)

模式[\s\S]没有意义,它等同于.

  • \s - 空白
  • \S - 非空白
  • [\s\S] - 空白或非空白,所以一切基本上等同于.

您可能需要的是简单的正则表达式:

/START\s+ID:\s+15\s+END/gm

...这与您的单个“记录”匹配,ID为15。

但是你也说你有“(...)一个你想要划分的巨大文本(...)”。这与您的以下示例相矛盾。如果你想获得你可能需要的每条记录,请尝试使用:

/START\s+ID:\s+(\d)+\s+END/gm