我正在尝试编写一个自定义语法(通过YAML),在这里我想指出注释区域规则。例如: /* */ -是注释部分的一个常见的从-指示到指示。
伪造下列密码:
((?=/*)\s**(?<=*/))
它在这里运行得很好:https://regex101.com/r/EQqn7b/2/
然而,在“崇高”中尝试了它之后,它将不匹配文本在注释部分区域的开头和结尾之间的新行:
(灰色-是上述正则表达式成功匹配的文本)
因此,所期望的效果是使这两种情况显示在更早的图片-匹配的正则表达式在崇高。
有人能指出我做错了什么或错过了什么吗?
谢谢!
注意:像(?s)这样的标志-被视为不可识别的,从而使其不可用。
发布于 2018-08-23 19:59:43
你碰到了这个(摘自语法文档,重点是我的):
#
、:
、-
、{
、[
或>
,那么您可能需要引用它。正则表达式一次只对一行文本运行,。也就是说,您的regex不匹配于多个行,因为它是一次一个地给这些行提供信息,而不是按照您预期的方式。
为了支持跨越多行的语法构造,您需要使用第二个context
。这方面的一个例子可能如下所示(取自默认C语法):
- match: /\*
scope: punctuation.definition.comment.c
push:
- meta_scope: comment.block.c
- match: \*/
scope: punctuation.definition.comment.c
pop: true
这意味着当文本/*
匹配时,解析器应该使用它自己的一组规则将一个新的匿名上下文推送到解析堆栈上,直到匹配规则告诉它弹出它开始使用的上下文为止,解析堆栈仍然有效。
内部(匿名)上下文在*/
上只有一个匹配规则,并有从堆栈中弹出上下文的指令,这会阻止任何其他语法规则匹配,直到看到注释的末尾为止。
这还显示了将匹配的/*
和*/
部分分别限定为注释标点符号,而meta_scope
则适用于整个匹配(包括输入上下文的文本和弹出上下文的文本)。
这使得整个/* comment */
作为一个整体作用域成为comment.block.c
,同时还对启动和停止它的字符应用特定的上下文,因为您的配色方案可能希望对它们进行不同的着色,或者插件可能希望能够检测到注释分隔符,等等。
在该内部context
中,您可以添加任意多个额外的匹配规则。例如,您可以包括一个与TODO
匹配的对象,以给它一个额外的范围,以便您的配色方案能够针对它们并使它们脱颖而出,等等。
发布于 2018-08-23 19:19:30
我相信您的解决方案不起作用,因为您没有在解决方案中使用MULTILINE/DOTALL。您可以将这些参数传递给执行计算的方法,或者只需在正则表达式的开头添加(?s)
。见这篇文章:
https://stackoverflow.com/questions/51992777
复制相似问题