正则表达式(?!\ G)在语言语法中做了什么

时间:2016-04-13 06:22:21

标签: regex grammar atom-editor

我一直在语言语法中看到这个正则表达式,它允许编辑者突出语法。

我知道正则表达式试图传达的内容:

(?!\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正则表达式匹配,就像在哪里停止一样?

有人可以解释一下吗?

1 个答案:

答案 0 :(得分:3)

查看一些Language Grammars reference first

  

规则可以通过两种方式匹配文档。它可以提供单个正则表达式,也可以为两个。与上面第一条规则中的 match 键(第6-8行)一样,与该正则表达式匹配的所有内容都将获得该规则指定的名称。   ...   另一种类型的匹配是第二条规则使用的匹配(第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,然后正则表达式匹配任何字符{{1匹配任何不是上一次成功匹配结束而不是字符串开头的位置。这是让其他嵌套规则工作所必需的,即那些匹配(?!\G)模式的规则。否则,该块将在之前完成,并且将从匹配中跳过方法名称。