使用开始和结束正则表达式选择单词

时间:2015-10-21 08:40:24

标签: regex gherkin

我有这个.feature文件,语法使用以下模式着色:

[
    {
        "match": '#(.*)$'
        "name": 'comment.line.gherkin'
    }
    {
        "match": '^\.\.\.(.*)$'
        "name": 'comment.line.gherkin'
    }
    {
        "match": '(^\*\*\*.*?\*\*\*)|((?<=^\|)\s+\*\*\*.*?\*\*\*)'
        "name": 'support.class.gherkin'
    }
    {
        "match": '(\$\{.*?\})|(@\{.*?\})'
        "name": 'string.single.qoute.gherkin'
    }
    {
        "match": '\s*(Scenario\:|Feature\:|Scenario Outline\:|Background\:|Examples\:)'
        "name": 'keyword.gherkin'
    }
    {
        "match": '\s*(Given|Then|When|And|But)'
        "name": 'support.class.gherkin'
    }
    {
        "match": '(?<=\s|^)(@[A-Za-z0-9_\-]+)'
        "name": 'entity.name.function.decorator.gherkin'
    }
    {
        "begin": '(^[^ \t\*\n\|]+)|((?<=^\|)\s+[^ \t\*\n\|]+)'
        "end": '\s{2}|\t|$|\s+(?=\|)'
        "name": 'keyword.gherkin'
    }
    {
        "match": '\s(\d*)\s'
        "name": 'entity.name.function.decorator.gherkin'
    }
    {
        "match": '(\<\w+\>)'
        "name": 'constant.character.escape.feature'
    }
    {
        "match": "(\s\'.*?[^\']\'\s)"
        "name": 'string.single.qoute.gherkin'
    }
    {
        "match": '(\s\".*?[^\"]\"\s)'
        "name": 'string.double.qoute.gherkin'
    }
    {
        "match": "\[(\'.*?[^\']\')\]"
        "name": 'constant.character.escape.feature'
    }
    {
        "match": '(\[[^]]*\])'
        "name": 'constant.numeric.gherkin'
    }
    {
        "match": '\|\s(.*)\s\|'
        "name": 'constant.numeric.gherkin'
    }
]

问题在于,当我尝试使用此语法高亮显示编写小文件时(没有完美遵循小黄瓜结构),正则表达式模式突出显示'keyword.gherkin'下的所有内容,直到找到关键字。 这是困扰我的模式:

      {
          "begin": '(^[^ \t\*\n\|]+)|((?<=^\|)\s+[^ \t\*\n\|]+)'
          "end": '\s{2}|\t|$|\s+(?=\|)'
          "name": 'keyword.gherkin'
      }

如果我删除这些行,它可以满足我的需要,但是我在文件中放松了一些文本突出显示|1|2|3|这不是真正的解决方案。

我们举一个例子。

请记住,正在对这些正则表达式进行持续评估。

我开始在文档中键入单词Feature:,当我输入时,它会以红色突出显示。一旦我完成并且我继续写作,例如Feature: do something“功能:”为红色,其余文本变为标准颜色。 这将是正确的行为。

例如,如果在文档的开头我开始输入will do something,它会以红色突出显示,并且不应该是因为那里没有任何gherking关键字。

“name”:在模式中的作用是强制语法颜色,因此它不相关。

我已尝试对模式进行多次修改但没有任何成功。

这是一个文件示例:https://regex101.com/r/qU5mY5/3

我是否针对错误的模式?如果没有,任何人都可以给我一些启示?

1 个答案:

答案 0 :(得分:1)

第一个问题

不需要的文字不应突出显示(will do something)。

正如您所说,问题出在第二个 keyword-regex 的第一部分中,具体为:

"begin": '(^[^ \\t\\*\\n\\|]+)|...'

匹配一切行首开始

  • 空格' '
  • 标签\t
  • 一个文字明星*
  • 换行\n
  • 管道|

因此,如果一行与<{1}}开始,则会匹配,直到正则表达式引擎不会遇到 end-regex :两个空格will do something或标签\s{2}或行尾\t&#34;一个或多个空格&#34; 后跟管道$

第二个问题

如果要匹配与\s+(?=\|)完全匹配的行,则必须修改 begin-regex 的第二部分,并使用可选空格|1|2|3|,如下所示:< / p>

\s*

在线模拟,说明了这些行为HERE

<小时/> 这可能会为您提供足够的信息来解决您的问题,但如果您需要一个特定的解决方案,我需要更多详细信息,确定小黄瓜关键字可以与以下之一分开:

 "begin": '...|((?<=^\\|)\\s*[^ \\t\\*\\n\\|]+)'

PS :可能在上面的正则表达式中,冒号不需要转义并且可以分组。此外,如果两个字符串具有共同的子字符串,则将最长的字符串放在第一位以正确匹配(或始终将元素从 OR-list 中的最长到最短的顺序排序,以允许最长的字符串在发生时匹配):

'\\s*(Scenario\\:|Feature\\:|Scenario Outline\\:|Background\\:|Examples\\:)'

<强>更新

我已在线更新了正则表达式以匹配管道表。对于我所阅读的内容以及您的示例,下一个正则表达式应该适合您:

"match": '\\s*(Scenario Outline|Background|Examples|Scenario|Feature):'

在线更新版本HERE

更新2

阅读您已关联的gherking文档我决定您希望管道表 标题中突出显示的占位符作为 keyword.gherkin (红色),相反,表格的数值必须突出显示为 constant.numeric.gherkin 。如果是这样,你必须用这两个替换:

 {
     "begin": '(\|\s+[^ \t\*\n\|]+)'
     "end": '($|\s{2}|\t|\s+(?=\|))'
     "name": 'keyword.gherkin'
 }

keyword.gherkin将任何管道序列 { "match": '\|(\s*[a-zA-Z][\w\']+\s*\|)+\s*$' "name": 'keyword.gherkin' } { "match": '\|(\s*[\d\.]+\s*\|)+\s*$' "name": 'constant.numeric.gherkin' } 与由词组成的标题匹配,以字母| h1 | h2 |...| hn |开头(后跟字母,数字,下划线{{1}或单引号[a-zA-Z])。

第二个(constant.numeric.gherkin)类似地匹配管道序列_,但字段只能是数字(也是十进制形式的')。

更新3

查看您的示例文件,我们可以删除&#39; keyword.gherkin&#39; 正则表达式并更新&#39; constant.numeric.gherkin&#39; < / em>正则表达式如下:

| N1 | N2 | ... | Nn |

PS :此正则表达式突出显示管道表,而不考虑内部的字符。它不再是一个数字&#34;只有正则表达式,但我认为这是你需要的。