我有这个.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
我是否定位了错误的模式?如果没有,任何人都可以给我一些启发?
首要问题
不需要的文本在不应该显示的情况下以红色突出显示(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\\|]+)'
在此处演示这些行为的在线模拟。
'\\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] 删除。
我来说两句