【发布时间】:2018-12-30 17:57:24
【问题描述】:
我有类型为@variable a 2 的行,从行首开始。关键字及其标识符@variable 是已知且固定的。变量的第一个字符可以是[_a-zA-Z],第二个字符也可以是数字或组合。它们与variable 之间至少有一个空格,并且与值之间至少有一个空格,它也可以是一个表达式,例如(1+2)/2,或其他一些变量b,因此它以数字开头、字母或括号。行中之后的内容可能很多,不重要(其中还有换行符)。
我想做的是匹配变量,但前提是它是variable 之后的第一件事,然后是一个值或表达式。这是我最后一次尝试后的结果:
<context id="variable-noequal" style-ref="variable">
<match extended="true">
(((variable|variabel)\b\s+)?)
(([_a-zA-Z][_a-zA-Z0-9]*))
(?=((\s+)|(\s*\n)))
</match>
</context>
我尝试了各种组合(也涉及锤子),但我要么没有匹配,要么匹配可能跟随的变量的每个匹配(如 a 2 为了 善良 为了)。向后看总是给出lookbehind not fixed 或一些这样的错误。我也尝试过prefix/suffix/keyword,其中keyword 是您在上面看到的模糊匹配,但这也不起作用。搜索网络显示\K,这对我没有任何作用。我知道匹配可能会更好,例如,一个简单的下划线可以作为变量传递,我想我可以做到,但现在我只想看到它正确突出显示。我可能应该提到我不精通PCRE。有解决办法吗?
抱歉,我忘了在 GtkSourceView 中为 gEdit 添加,但我认为这是基于 PCRE 的(?)。
【问题讨论】:
-
试试
@variab(le|el)\s+[_a-zA-Z][_a-zA-Z0-9]*(?!\S),见regex101.com/r/j3otIZ/1。如果不符合您的预期,请说明应该匹配的内容。 -
@WiktorStribiżew 感谢您的评论,但我只想匹配变量
a,而不是匹配它之后的全部内容。如果您尝试我的代码,它会匹配a,但也匹配它之后的任何其他看起来像变量的东西,例如a 2 b 3、b也会突出显示。它也应该只在之前有@variable时才有效,如果您开始删除字符,它也会突出显示。我希望匹配在a之前开始,在a之后停止,并且仅在(未突出显示)@variable之后。 -
因此,如果您的正则表达式引擎与 PCRE 兼容,您可以使用
@variab(?:le|el)\s+\K[_a-zA-Z][_a-zA-Z0-9]*(?!\S)。如果它与 .NET 兼容,请使用(?<=@variab(?:le|el)\s+)[_a-zA-Z][_a-zA-Z0-9]*(?!\S) -
@WiktorStribiżew 如果我在正则表达式站点上测试它,它可以工作,但如果我在 gEdit 的
*.lang文件中使用它,它不会。正如我所提到的,我已经尝试过\K,但没有奏效。此外,第二种方法再次给了我lookbehind assertion is not fixed length。我不明白。 GtkSourceView 是否不支持\K或?&lt;=(我必须将其用作?&lt;=才能工作)? -
你找到了一个很好的参考。在父上下文中使用
@variab(?:le|el)\s+[_a-zA-Z][_a-zA-Z0-9]*\b,在子上下文中使用[_a-zA-Z][_a-zA-Z0-9]*。
标签: regex syntax-highlighting pcre gtksourceview