我有这个.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
我是否针对错误的模式?如果没有,任何人都可以给我一些启示?
答案 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;只有正则表达式,但我认为这是你需要的。