Lua | 字符串模式 | 在字符串中查找字符串的模式

我正在制作一个游戏内脚本编辑器,它几乎完成了。除了需要在键绑定等方面进行脚本编写之外,我还需要修复一些语法高亮器的问题。 这是编辑器目前的外观:

(UI 没有作任何处理,请忽略它。)

Picture of editor in game

显然,还有一些需要解决的问题,比如一些括号无法高亮。更大的问题在于我查找字符串的模式:

(([^\\]*["\']).*%2)

这个模式导致了这个问题:

Items between two strings become highlighted

我几周前停止了这个工作,我对模式的工作原理记忆不太清楚了。我尝试修改现有模式,以防止在匹配时包含两个字符串之间的文本,但它要么选择 EVERYTHING,要么找不到字符串。 我需要确保不要将 \' 或 \" 作为字符串的指示符。

点赞
用户2858170
用户2858170

你的模式有点复杂。你可以使用 %b"" 模式简单地匹配成对的 "

local myString = 'local a = {"one", "two", "tree"}'

for str in myString:gmatch('%b""') do print(str) end

输出

"one"
"two"
"tree"

参见 https://www.lua.org/manual/5.3/manual.html#6.4.1

%bxy,其中 x 和 y 是两个不同的字符;这种项匹配以 x 开头、以 y 结尾、以及 x 和 y 是平衡的字符串。这意味着,如果从左到右读取字符串,在 x 处加 1,在 y 处减 1,最终的 y 是第一个计数达到 0 的 y。例如,项 %b() 匹配具有平衡括号的表达式。

2020-05-20 06:15:40
用户151501
用户151501

你的问题在于你使用了贪婪匹配。这将故意找到最长匹配的字符串。相反,你应该使用懒惰匹配。这将允许你只匹配第一个字符串。懒惰匹配使用-符号而不是+

所以现在你可以为每个变量写一个简单的模式字符串。

>print(([["foo"]]):match("\"[^\"]-\""))
"foo"
>print(([["foo"  "bar"]]):match("\"[^\"]-\""))
"foo"
>
2020-05-21 03:04:27