Lua 模式中的捕获组匹配文字数字字符而不是捕获组
Capture group in Lua pattern matches literal digit character instead of capture group
我想提取包含 key="VALUE"
的行的值,我正在尝试使用简单的 Lua 模式来解决这个问题。
它适用于那些在 VALUE 中包含文字 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
。
我想提取包含 key="VALUE"
的行的值,我正在尝试使用简单的 Lua 模式来解决这个问题。
它适用于那些在 VALUE 中包含文字 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
。