使用Regex创建Gherkin结构

twh00eeo  于 2023-10-22  发布在  其他
关注(0)|答案(1)|浏览(73)

背景:

**我想要一个正则表达式,可以识别何时Gherkin语句写得不正确。**文本将是多行的。不幸的是,我不能使用代码解决方案来解决这个问题,它必须是PCRE正则表达式。

通过阅读小 cucumber 关键词文档,正确的结构顺序如下:
Feature > Rule (optional) > Background (Optional) > Examples/Scenarios (Optional) that contains > [One or more](Example/Scenario) that contains > Given > [One or more of any] When|Then|But|(And/*)
备注:

  • Scenarios/ExamplesScenario/ExampleAND/*表示它们是别名
  • 为清楚起见,必须存在一个或多个Scenario/Example,无论是否存在Scenarios/Examples可选“容器”

问题:

  • 我试图使用积极的情况(正确的格式匹配)来解决这个问题,并计划一旦我得到了否定的工作。

我尝试了非捕获组和消极的前瞻,但没有成功。例如,下面的代码将在RuleBackground之间匹配Scenario/Example,这不应该对正情况起作用。我的团队似乎太贪婪了?我不知道如何解决它,或者是否应该以不同的方式解决。
尝试使用非捕获组:

(Feature:[\s\S]+?)(?:Rule:[\s\S]+?)?(?:Background:[\s\S]+?)?(Scenario:[\s\S]+?)(Given:[\s\S]+?)(When|Then|And|\*)[\s\S]*?((?=(Scenario|Feature|$)))

部分尝试使用负前瞻来测试开始订单:

(Feature:[\s\S]+)(?=(Rule:[\s\S]+)?)(?=(Background:[\s\S]+)?)(?=(Scenario:[\s\S]+)*)

正确的小 cucumber 格式示例:

Feature: Web Searching
  As a business analyst, I want to use a public search engine to find information.

Rule: The browser used must be X

Background:
 Given a user has an information need
 And the browser X is installed on their device
  
Scenario: Simple search
 Given a web browser is on the search page
 When the search phrase "stackoverflow" is entered
 Then results for "stackoverflow" are shown
 And the user can choose a result from a list
jv2fixgn

jv2fixgn1#

%g不匹配的字符串就是^(?!%g$),就是这样。
我能够用以下Dimava的正则表达式语法生成匹配的正则表达式:

%0 = ^%e%Feature!%Rule!?%Background!?%Scenario!+$
%Feature! = Feature:%OptDesc!%Description!%e
%OptDesc! = \n|%ReqDesc!
%Description! = (?:%w\S.*\n)+

%Rule! = %wRule:%ReqDesc!%e
%ReqDesc! =  \S.*\n

%Background! = %wBackground:\n%Description2!%e
%Description2! = (?:%w%w\S.*\n)+

%Scenario! = %wScenario:%ReqDesc!%Given!%When!*%e
%Given! = %w%wGiven%ReqDesc!
%When! = %w%w(?:When|Then|And)%ReqDesc!

// indentation (two spaces)
%w =   
// empty lines
%e = \n*(?!\n)

导致正则表达式

^\n*(?!\n)(?:Feature:(?:\n| \S.*\n)(?:  \S.*\n)+\n*(?!\n))(?:  Rule: \S.*\n\n*(?!\n))?(?:  Background:\n(?:    \S.*\n)+\n*(?!\n))?(?:  Scenario: \S.*\n    Given \S.*\n(?:    (?:When|Then|And) \S.*\n)*\n*(?!\n))+$

您可以在https://regex101.com/r/hbLJc3/1上测试它
(you如果要使用编译器,需要在regex101页面上的浏览器控制台中运行代码段)
如果缺少您希望工作的用例,请将它们添加到“测试用例”中,并使用更新的regex101链接进行注解
更新到https://regex101.com/r/zmgSNK/1

%0 = ^%e%Feature!%Rule!?%Background!?%Scenario!+%f
%Feature! = Feature:%OptDesc!%Description!%e
%OptDesc! = %n|%ReqDesc!
%Description! = (?:%w\S.*%n)+

%Rule! = %wRule:%ReqDesc!%e
%ReqDesc! =  \S.*%n

%Background! = %wBackground:\n%Description2!%e
%Description2! = (?:%w%w\S.*%n)+

%Scenario! = %wScenario:%ReqDesc!%Given!%When!*%e
%Given! = %w%wGiven%ReqDesc!
%When! = %w%w(?:When|Then|And)%ReqDesc!

// indentation (empty)
%w = 
// empty lines
%e = \n*(?!\n)
// line of EOF
%n = (?:\n|%f)
// EOF
%f = $

结果为https://regex101.com/r/PhSdY7/1

^\n*(?!\n)Feature:(?:(?:\n|$)|(?: \S.*(?:\n|$)))(?:(?:\S.*(?:\n|$))+)\n*(?!\n)(?:Rule:(?: \S.*(?:\n|$))\n*(?!\n))?(?:Background:\n(?:(?:\S.*(?:\n|$))+)\n*(?!\n))?(?:Scenario:(?: \S.*(?:\n|$))Given(?: \S.*(?:\n|$))(?:(?:When|Then|And)(?: \S.*(?:\n|$)))*\n*(?!\n))+$

相关问题