【问题标题】:ACE Editor multiline regexACE 编辑器多行正则表达式
【发布时间】:2016-02-09 10:01:40
【问题描述】:

我正在使用 ACE Editor 来语法高亮我网站的 BBCode 系统,总的来说它运行良好。唯一不一样的是我们相当于多行 cmets:

[nobbcode]
    I am a demo of [b]BBCode[/b].
    Anything in here is shown as plain text, with code left intact,
    allowing people to show how it works.
[/nobbcode]

这个规则是:

{
    token:[
        "meta.tag.punctuation.tag-open.xml",
        "meta.tag.tag-name.xml",
        "meta.tag.punctuation.tag-close.xml",
        "comment",
        "meta.tag.punctuation.end-tag-open.xml",
        "meta.tag.tag-name.xml",
        "meta.tag.punctuation.tag-close.xml"
    ],
    regex:/(\[)(nobbcode)(\])([\s\S]*?)(\[\/)(nobbcode)(\])/,
    caseInsensitive:true
},

在这样的例子中效果很好:

You can use [nobbcode][b]...[/b][/nobbcode] to designate bold text.

匹配在单行上,但它似乎不喜欢多行文本。

ACE 不支持多行正则表达式,如果支持,我应该将其分解为“开始评论、评论、结束评论”部分吗?

【问题讨论】:

  • 也许你已经看过这个2014 google group discussion,但是,以防万一......
  • 啊,所以是逐行的?这是有道理的。我发现官方文档有时很难理解......如果确实如此,那么在这里实现状态的最简单方法是什么?例如,使用 push/pop 或单独的状态?
  • 我会使用一些isMultiLineComment 来表示我认为的状态...

标签: javascript regex ace-editor


【解决方案1】:

感谢@Thomas 的评论,我了解到 ACE 会逐行解析,因此多行正则表达式将不起作用。

我使用以下语法规则解决了我的问题:

{
    token:[
        "meta.tag.punctuation.tag-open.xml",
        "meta.tag.tag-name.xml",
        "meta.tag.punctuation.tag-close.xml"
    ],
    regex:/(\[)(nobbcode)(\])/,
    caseInsensitive:true,
    push:[
        {
            token:[
                "meta.tag.punctuation.end-tag-open.xml",
                "meta.tag.tag-name.xml",
                "meta.tag.punctuation.tag-close.xml"
            ],
            regex:/(\[\/)(nobbcode)(\])/,
            caseInsensitive:true,
            next:"pop"
        },
        {defaultToken:"comment"}
    ]
},

这实际上将其分解为开始-中间-结束,将“评论”标记应用到带有defaultToken 的中间部分。

我只是希望 ACE 被记录得更好......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多