【问题标题】:Match fuzzy pattern, without previous words, but only for one occurence匹配模糊模式,没有前面的单词,但只出现一次
【发布时间】: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 3b 也会突出显示。它也应该只在之前有 @variable 时才有效,如果您开始删除字符,它也会突出显示。我希望匹配在a 之前开始,在a 之后停止,并且仅在(未突出显示)@variable 之后。
  • 因此,如果您的正则表达式引擎与 PCRE 兼容,您可以使用 @variab(?:le|el)\s+\K[_a-zA-Z][_a-zA-Z0-9]*(?!\S)。如果它与 .NET 兼容,请使用 (?&lt;=@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?&amp;lt;=(我必须将其用作?&amp;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


【解决方案1】:

我最初将其发布到您的 gtksourceview issue,但也许其他人可能会觉得这很有用:

我相信这样的事情会做你想做的事:

<context id="variable-declaration">
  <start>@variable\%]</start>
  <end>(?=\S)</end>
  <include>
    <context id="variable-name" style-ref="variable" once-only="true">
      <match>[_a-zA-Z][_a-zA-Z0-9]*</match>
    </context>
  </include>
</context>

\%] 是一个custom word boundary,类似于\b,但可以用&lt;keyword-char-class&gt; 重新定义。

【讨论】:

  • 感谢您的回复,但同时该行为已被遗忘,因此不再需要。但这仍然是可能需要的东西,我会搜索并挖掘旧备份,看看它是如何工作的。
猜你喜欢
  • 1970-01-01
  • 2014-03-05
  • 1970-01-01
  • 1970-01-01
  • 2018-11-22
  • 2019-08-17
  • 2013-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多