首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么“崇高语法”不通过regex将从A到B的文本与新行匹配?

为什么“崇高语法”不通过regex将从A到B的文本与新行匹配?
EN

Stack Overflow用户
提问于 2018-08-23 19:11:20
回答 2查看 247关注 0票数 0

我正在尝试编写一个自定义语法(通过YAML),在这里我想指出注释区域规则。例如: /* */ -是注释部分的一个常见的从-指示到指示。

伪造下列密码:

((?=/*)\s**(?<=*/))

它在这里运行得很好:https://regex101.com/r/EQqn7b/2/

然而,在“崇高”中尝试了它之后,它将不匹配文本在注释部分区域的开头和结尾之间的新行:

下面是它在“崇高”中的样子

(灰色-是上述正则表达式成功匹配的文本)

因此,所期望的效果是使这两种情况显示在更早的图片-匹配的正则表达式在崇高。

有人能指出我做错了什么或错过了什么吗?

谢谢!

注意:像(?s)这样的标志-被视为不可识别的,从而使其不可用。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-23 19:59:43

你碰到了这个(摘自语法文档,重点是我的):

  • match.正则表达式用于与文本匹配。YAML允许在没有引号的情况下编写许多字符串,这有助于使正则表达式更清晰,但重要的是要理解何时需要引用regex。如果正则表达式包含字符#:-{[>,那么您可能需要引用它。正则表达式一次只对一行文本运行,

也就是说,您的regex不匹配于多个行,因为它是一次一个地给这些行提供信息,而不是按照您预期的方式。

为了支持跨越多行的语法构造,您需要使用第二个context。这方面的一个例子可能如下所示(取自默认C语法):

代码语言:javascript
运行
复制
- 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匹配的对象,以给它一个额外的范围,以便您的配色方案能够针对它们并使它们脱颖而出,等等。

票数 3
EN

Stack Overflow用户

发布于 2018-08-23 19:19:30

我相信您的解决方案不起作用,因为您没有在解决方案中使用MULTILINE/DOTALL。您可以将这些参数传递给执行计算的方法,或者只需在正则表达式的开头添加(?s)。见这篇文章:

崇高的文本正则表达式不检测多行标记

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51992777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档