Lua模式中的捕获组匹配文字数字字符,而不是捕获组

Lua模式中的捕获组匹配文字数字字符,而不是捕获组,lua,string-matching,lua-patterns,Lua,String Matching,Lua Patterns,我想提取包含key=“VALUE”的行的值,我正试图使用一个简单的Lua模式来解决这个问题 它适用于除值中包含文字1的行以外的行。模式解析器似乎混淆了我的捕获组的转义序列 > return string.find('... key = "PHONE2" ...', 'key%s*=%s*(["\'])([^%1]-)%1') 5 18 " PHONE2 > return string.find('... key = "PHONE1" ...',

我想提取包含
key=“VALUE”
的行的值,我正试图使用一个简单的Lua模式来解决这个问题

它适用于除值中包含文字
1
的行以外的行。模式解析器似乎混淆了我的捕获组的转义序列

> return  string.find('... key = "PHONE2" ...', 'key%s*=%s*(["\'])([^%1]-)%1')
5       18      "       PHONE2
> return  string.find('... key = "PHONE1" ...', 'key%s*=%s*(["\'])([^%1]-)%1')
nil
>

您根本不需要使用
[^%1]
。只需使用
-
,因为根据定义,它匹配最小的字符串

此外,您还可以使用多行字符串语法,以便不必转义模式中的引号:

> s=[[... key = "PHONE1" ...]]
> return s:find [[key%s*=%s*(["'])(.-)%1]]
5       18      "       PHONE1


模式
[^%1]
实际上意味着不要单独搜索字符
%
1

谢谢。我还发现,我会逃离1,迫使它将捕获组包括在集合中<代码>[^%\1]您的解决方案更有意义而且更干净。我会用的。@nolan在这种情况下,你只想用
[^\1]
%
字符不是必需的。实际上不是。非常感谢。