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

塞伦斯

我有这个.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,则该内容将以红色突出显示,而不应该以红色突出显示,因为其中没有任何紧缩关键字。

什么是“名”:确实在图案是stablish语法颜色,因此它是不相关的。

我已经尝试过对该模式进行多次修改,但均未成功。

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

我是否定位了错误的模式?如果没有,任何人都可以给我一些启发?

朱塞佩·里库佩罗(Giuseppe Ricupero)

首要问题

不需要的文本在不应该显示的情况下以红色突出显示(will do something)。

正如您正确指出的那样,该问题位于第二个keyword-regex的第一部分中,尤其是:

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

它匹配从行首开始的所有内容,而不是

  • 空间 ' '
  • 一个标签 \t
  • 一个名副其实的明星 *
  • 换行符 \n
  • 管道 |

所以,如果一个行开始will do something它相匹配,直到正则表达式引擎不会遇到的最终正则表达式:两个空格\s{2}或制表符\t或行的结束$“一个或多个空格”后跟一个管道\s+(?=\|)

第二个问题

如果要匹配从头开始的行,则必须使用以下可选空格|1|2|3|修改begin-regex的第二部分\s*

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

此处演示这些行为的在线模拟


这可能会为您提供足够的信息来解决您的问题,但是如果您需要一种特定的解决方案,那么我需要更多关于 gherkin关键字 可以与以下内容分开的详细信息

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

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

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

更新

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

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

在线更新版本HERE

更新2

阅读链接的文档后,我决定要管道表标题中找到占位符会被突出显示为keyword.gherkin(红色),而必须将表格的数值突出显示为constant.numeric.gherkin如果是这样,则必须用以下两者替换:

 {
     "match": '\|(\s*[a-zA-Z][\w\']+\s*\|)+\s*$'
     "name": 'keyword.gherkin'
 }
 {
     "match": '\|(\s*[\d\.]+\s*\|)+\s*$'
     "name": 'constant.numeric.gherkin'
 }

keyword.gherkin将任何管道序列| h1 | h2 |...| hn |与标头匹配,该标头由以字母开头单词组成[a-zA-Z](可以跟字母,数字,下划线_或单引号')。

第二个(constant.numeric.gherkin)类似地匹配管道序列,| N1 | N2 | ... | Nn |但字段只能是数字(也为十进制形式123.25)。

更新3

查看示例文件,我们可以完全删除“ keyword.gherkin”正则表达式,并更新“ constant.numeric.gherkin”正则表达式,如下所示:

{
    "match": '\|(.+\|)+'
    "name": 'constant.numeric.gherkin'
}

PS:此正则表达式突出显示管道表,而与内部的字符无关。它不再是仅用于“数字”的正则表达式,但是我认为这是您所需要的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

正则表达式匹配由开始和结束单词分隔的单词前后的多行

正则表达式匹配以使用angular的表达式开始和结束

正则表达式在python中的开始和结束使用变量中查找带有字母的单词?

正则表达式表示开始和结束特定单词[无重复]

python正则表达式检查字符串中单词的开始和结束

定义正则表达式的结束和开始

如何检查正则表达式以正则表达式开始和结束

PHP - 使用正则表达式在开始和结束字符串之间选择字符串

Java正则表达式选择字符串中的开始和结束引号

正则表达式,用于选择带有特定开始和结束字符串的文本,并且还排除特定单词

如何使用开始和结束字符验证来构建验证正则表达式?

通过使用正则表达式加上字典或python中的哈希映射来动态替换句子中单词的所有开始和结束字母

如何在MySQL中使用正则表达式单词“ IN”和“ INNER JOIN”进行选择?

令牌中的正则表达式的开始/结束

正则表达式-如果开始匹配则匹配结束

如何使用正则表达式从python中的图像路径获取开始文本和结束文本?

正则表达式:如何使用相同的标签来识别比赛的结束和另一场比赛的开始

在正则表达式中使用向量来提取只有已知开始和结束的子字符串

如果指定开始和结束,包括开始和结束,如何使用正则表达式获取子字符串

正则表达式-用开始和结束引号替换带引号的字符串

Java –正则表达式–匹配开始和结束的卷曲标签

PHP正则表达式:从开始和结束删除所有字符

返回开始和结束正则表达式之间的文本

Javascript 正则表达式如何匹配开始和结束标记

如何在Perl中提取开始和结束正则表达式之间的行

Python正则表达式,匹配组范围(开始和结束)

用正则表达式匹配字符串的相同开始和结束字符

正则表达式获取字符串的开始和结束匹配

正则表达式,用于删除开始和结束引号之间的空格(PHP)