使用正则表达式匹配 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 多行字符串和注释的主要内容,如果未能解决你的问题,请参考以下文章