【问题标题】:Highlight.js not respecting parent regex of a sub modeHighlight.js 不尊重子模式的父正则表达式
【发布时间】:2020-02-19 00:46:46
【问题描述】:

我需要编写一个词法分析器来正确突出我的命令行工具命令。

$ dvc add file.csv
$ dvc pipeline list

所以该命令以dvc 开头,它可能有一个或两个子命令——分别是addpipeline list

因此,它应该分别在第一种和第二种情况下突出显示dvc adddvc pipeline list

contains: [
          {
            begin: /^\s*\$\s(dvc|git) [a-z-]+/,
            returnBegin: true,
            contains: [
              {
                begin: /dvc [a-z-]+ ?/,
                lexemes: '[a-z-]+',
                keywords: {
                  built_in:
                    'dvc'
                },
                contains: [
                  {
                    begin: /\w+(?![\S])/,
                    keywords: {
                      built_in: 'list'
                    }
                  }
                ],
                className: 'strong'
              }
            ]
          }
        ]

它匹配dvc pipeline list,即使父正则表达式,即/^\s*\$\s(dvc|git) [a-z-]+/ 应该只匹配到dvc pipeline。它究竟是如何运作的?

/dvc [a-z-]+ ?/ 如何覆盖它并继续匹配表达式?

请在此处参考此库文档:https://highlightjs.readthedocs.io/en/latest/reference.html

【问题讨论】:

  • 请为该问题提供更多背景信息 - 例如,链接到荧光笔文档。
  • 你能创建一个jsfiddle吗?这将使交互式调查问题变得容易。
  • lexemes: '[a-z-]+', 是做什么的?
  • @ColdCerberus 我认为它可以匹配关键字。 highlightjs.readthedocs.io/en/latest/reference.html#lexemes
  • 我明白了。另外,您是否确认\W\S 不会导致问题?之前有关于这些的错误

标签: javascript syntax-highlighting highlight highlight.js dvc


【解决方案1】:

Begin 只是开始一场比赛,并不限制比赛。第一条规则匹配,然后倒带......然后匹配/dvc [a-z-]+ ?/,然后开始在contains中寻找孩子......所以然后/\w+(?![\S])/匹配(你仍然在你的强规则内)所以你'见:

<strong>dvc pipeline list</strong>
<!-- matches /^\s*\$\s(dvc|git) [a-z-]+/ -->
  <!-- matches /dvc [a-z-]+ ?/ -->
  <strong>
    dvc pipeline   
      <!-- contains matches  /\w+(?![\S])/ --> 
      list
      <!-- no more matches for /\w+(?![\S])/ --> 
      <!-- end fires, back up -->
    <!-- no more matches for /dvc [a-z-]+ ?/-->
    <!-- end fires --> 
  </strong>
  <!-- back up -->

如果您想检测一堆不同的模式,我建议为每个模式使用不同的模式:

{ begin: /dvc add .../, contains: ... }
{ begin: /dvc pipeline .../, contains: ... }

尽管您可能还想看看startscontains。编写语法来表达匹配 A,然后是 B,然后是 C 可能非常困难。工具是有的,但要正确并充满危险与做一些简单的事情相比,可能会非常复杂。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多