使用正则表达式匹配 Lua 多行字符串和注释

Posted

技术标签:

【中文标题】使用正则表达式匹配 Lua 多行字符串和注释【英文标题】:Match Lua multiline strings and comments with Regex 【发布时间】: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正则表达式中可能吗?怎么样?

【问题讨论】:

【参考方案1】:

试试这个

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

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

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

【讨论】:

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

以上是关于使用正则表达式匹配 Lua 多行字符串和注释的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式如何匹配多行的所有任意字符

正则表达式匹配注释(单行或多行)并匹配其他所有内容(C#)

使用正则表达式删除注释

使用正则表达式删除注释

使用正则表达式删除注释

Lua:字符串匹配和正则表达式