正则表达式,根据特定的文本行选择一组文本/一串行

时间:2017-06-07 23:09:30

标签: regex negative-lookahead capture-group

我的格式如下

Scenario: Lorem ipsum dolor sit amet, consectetur adipiscing elit
Given sed do eiusmod tempor
When Ut enim ad minim veniam, quis nostrud exercitation
Then In voluptate velit esse cillum dolore eu fugiat nulla

@Sprint4 @543fsdf
Scenario: Lorem ipsum dolor sit amet, consectetur adipiscing elit
Given sed do eiusmod tempor incididunt ut labore et dolore magna aliqua
When Ut enim ad minim veniam, quis nostrud exercitation
Then In voluptate velit esse cillum dolore eu fugiat nulla

@Sprint1 @345277
Scenario: Sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt returned correct singular message
Given sed do eiusmod tempor incididunt ut labore et dolore magna aliqua
And Duis aute irure dolor in reprehenderit  
When Ut enim ad minim veniam, quis nostrud
Then quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur

@Sprint1 @xyz1234
Scenario: At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis
Given sed do eiusmod tempor incididunt ut labore et dolore magna aliqua
And Duis aute irure dolor in reprehenderit  
When Ut enim ad minim veniam, quis nostrud
Then quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur

我想根据其中的一行文字选择整个场景。

例如。

基于'给定sed do eiusmod tempor incididunt ut labore et dolore magna aliqua'

我想要第二个场景

Scenario: Lorem ipsum dolor sit amet, consectetur adipiscing elit
Given sed do eiusmod tempor incididunt ut labore et dolore magna aliqua
When Ut enim ad minim veniam, quis nostrud exercitation
Then In voluptate velit esse cillum dolore eu fugiat nulla

,也是第三和第四种情况 - 但不是第一种情况

我正在尝试

Scenario[\s\S]*?Given sed do eiusmod tempor incididunt
ut labore et dolore magna aliqua[\s\S]*?(?=(@|Scenario))

但是这给了我第一和第二个场景,第三个但没有第四个场景。我尝试了其他模式,但没有取得很大的成功。帮助

2 个答案:

答案 0 :(得分:0)

鉴于您的场景始终以新线开头,您可以使用look-behind来搜索它,并且您可以使用look-aheat搜索空格,然后搜索@或字符串结尾以捕获匹配块的结束。所以,举个例子:

(?<=\s)Scenario.*?[\r\n]+Given sed do eiusmod tempor incididunt ut labore et dolore magna aliqua[\r\n]+.*?(?=\s+@|\s*$)

您没有指定您使用的语言,因此您必须进行设置,但是从选项(如果不是默认设置)您需要选择该点与换行符匹配,并且{{ 1}}和^不匹配换行符,而是匹配整个字符串。

答案 1 :(得分:0)

我不知道是否会有所帮助,但我所做的是将所有行与@匹配到行尾。因此,如果是这种情况,您可以将其替换为null。

(@\V+)

https://regex101.com/r/iCt1j2/1