繁体   English   中英

正则表达式(?!\\ G)在语言语法中有什么作用

[英]What does the regex (?!\G) do in language grammars

我一直在语言语法中看到此正则表达式,使编辑者可以突出显示语法。

我知道正则表达式试图传达什么:

(?!\G) Negative Lookahead - Assert that it is impossible to match the regex below
\G assert position at the end of the previous match or the start of the string for the first match

这是引起我注意的代码段:

安慰

# console.log(arg1, "arg2", [...])
'begin': '\\bconsole\\b'
'beginCaptures':
  '0':
    'name': 'entity.name.type.object.console.js'
'end': '(?!\\G)'
'patterns': [
  {
    'begin': '\\s*(\\.)\\s*(assert|clear|debug|error|info|log|profile|profileEnd|time|timeEnd|warn)\\s*(?=\\()'
    'beginCaptures':
      '1':
        'name': 'meta.delimiter.method.period.js'
      '2':
        'name': 'support.function.console.js'
    'end': '(?<=\\))'
    'name': 'meta.method-call.js'
    'patterns': [
      {
        'include': '#arguments'
      }
    ]
  }
]

上面的代码片段来自atom / language-javascript软件包。

通过浏览各种文本伴侣论坛,我了解到,为了突出显示,编辑器将从头begin ,一直到正则表达式end 在这里,它从匹配console关键字开始,然后一直到匹配end正则表达式为止,我无法理解它,例如,它将在哪里停止?

有人可以解释吗?

首先查看一些语言语法参考

规则可以两种方式匹配文档。 它可以提供一个正则表达式,也可以提供两个。 与上面第一个规则(第6-8行)中的match键一样,所有与该正则表达式匹配的内容都将获得该规则指定的名称。 ...另一种匹配类型是第二条规则使用的匹配类型(第9-17行)。 在这里,使用beginend键给出了两个正则表达式。 规则的名称将从开始模式匹配的地方到结束模式匹配的地方(包括两个匹配项)进行分配。 如果end模式不匹配,则使用文档的结尾。

在后一种形式中,规则可以具有子规则,这些子规则与开始和结束匹配之间的部分匹配。

请注意,一次仅将正则表达式与文档的一行匹配。 这意味着不可能使用与多行匹配的模式

beginend —这些键允许跨越多行的匹配, 并且必须与match键互斥 每个都是正则表达式模式。 begin是开始该块的模式, end是结束该块的模式

您提供的规则匹配的文本一样console.log和突出的3个不同的部分组成: console. log

'begin': '\\bconsole\\b'
'beginCaptures':
  '0':
    'name': 'entity.name.type.object.console.js'
'end': '(?!\\G)'

在这里, console作为一个整体被匹配,整个匹配(因为第0组是整个匹配)被命名为entity.name.type.object.console.js ,然后正则表达式匹配任何字符,直到(?!\\G)匹配不是最后一次成功匹配的结尾也不是字符串开头的任何位置。 为了使其他嵌套规则(即与'\\\\s*(\\\\.)\\\\s*(assert|clear|debug|error|info|log|profile|profileEnd|time|timeEnd|warn)\\\\s*(?=\\\\()'模式,否则,该块将在此之前完成,并且方法名称将从匹配中跳过。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM