【问题标题】:Match Lua multiline strings and comments with Regex使用正则表达式匹配 Lua 多行字符串和注释
【发布时间】:2017-03-20 03:34:49
【问题描述】:

我有一个 Lua 编辑器,我在其中实现了语法高亮。我使用正则表达式来匹配 Lua 的字符串、cmets、令牌、数字等表达式。整个事情是用 Java 制作的,并使用 Java 正则表达式。我遇到了两件事:

多行字符串 - Lua 多行括号以双方括号[[ 开始和结束@ 之间的所有内容都是字符串,甚至可以嵌套多行字符串。你可以看到我所做的here,正则表达式是\[\[((?>[^\[\[\]\]]|(?R))*\]\]),它可以工作。它类似于您在this page匹配平衡构造 部分下看到的内容。它会找到具有相等数量的 [[]] 的表达式。问题是,Java 正则表达式引擎不支持递归。如何将其替换为受支持的内容?

多行 cmets - Lua 多行 cmets 以 --[====[ 开头并以 ]====] 结尾。仅当等号与左括号一样多时才结束。可以有 0 到无限等号之间的任何位置。我制作了this regex--\[\[((.|\n)*?)\]\],但它仅适用于--[[ comment ]] 模式,不支持--[==[ comment ]==]。也许我可以做一些事情,比如计算开头等号匹配的数量,然后匹配结束标签的相同数字。这在java正则表达式中可能吗?怎么样?

【问题讨论】:

    标签: java regex lua


    【解决方案1】:

    试试这个

    --\[(=*)\[(.|\n)*?\]\1\]
    

    多行字符串字面量完全相同,但没有前导--

    \[((=*)\[(.|\n)*?)\]\2\]
    

    【讨论】:

    • Lua中的多行字符串不能嵌套:x = [[ [[ ]] ]]是语法错误
    • 关于(.|\n)*? 的注释:如果正则表达式风格是Java,请避免这种结构,使用.*? 并在正则表达式的开头添加(?s) 以避免堆栈溢出问题。基本上,总是避免(.|\n) 的事情。
    • @WiktorStribiżew 你的意思是使用单行标志,所以. 也匹配换行符?你能举出上面两个正则表达式的例子吗?
    • 1) (?s)--\[(=*)\[(.*?)\]\1\], 2) (?s)\[(=*)\[(.*?)\]\1\]
    猜你喜欢
    • 2021-09-11
    • 2013-04-20
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 2014-04-18
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    相关资源
    最近更新 更多