将POSIX正则表达式移植到Lua模式-意外结果

将POSIX正则表达式移植到Lua模式-意外结果,lua,lua-patterns,Lua,Lua Patterns,我很难将POSIX正则表达式移植到Lua字符串模式 我正在处理html响应,我想从中筛选复选框 检查过了。我特别感兴趣的是 每个复选框: <input class="rid-2 form-checkbox" id="edit-2-access-printer-friendly-version" name="2[access printer-friendly version]" value="access printer-friendly version" type="checkbox"&g

我很难将POSIX正则表达式移植到Lua字符串模式

我正在处理html响应,我想从中筛选复选框 检查过了。我特别感兴趣的是 每个复选框:

<input class="rid-2 form-checkbox" id="edit-2-access-printer-friendly-version" name="2[access printer-friendly version]" value="access printer-friendly version" type="checkbox">
以下是我感兴趣的复选框示例:

<input class="rid-2 form-checkbox" id="edit-2-access-comments" name="2[access comments]" value="access comments" checked="checked" type="checkbox">

<input class="rid-3 form-checkbox real-checkbox" id="edit-3-administer-comments" name="3[administer comments]" value="administer comments" checked="checked" type="checkbox">
(根据注释进行更新)当未选中的行位于输入为
-
表达式中带有
checked=“checked”
的行之前时,模式不起作用。有几种方法可以避免这种情况;@EgorSkriptunoff建议的一个方法是使用
([^“]*)
作为模式;另一个方法是排除新行
([^\r\n])

local s = [[
<input class="rid-2 form-checkbox" id="edit-2-access-comments" name="2[access comments]" value="access comments" checked="checked" type="checkbox">
<input class="rid-2 form-checkbox" id="edit-2-access-printer-friendly-version" name="2[access printer-friendly version]" value="access printer-friendly version" type="checkbox">
<input class="rid-3 form-checkbox real-checkbox" id="edit-3-administer-comments" name="3[administer comments]" value="administer comments" checked="checked" type="checkbox">
]]
local pattern = 'name="([^\r\n]-)" value="([^\r\n]-)" checked="checked"' 
for name, value in string.gmatch(s, pattern) do
  print(name, value)
end
我在Python中使用了以下模式:
pattern=r'name=“(.*)”value=“(.*)”checked=“checked”
,它刚刚起作用

Python
re
不兼容POSIX,并且
匹配除换行符以外的任何字符(在POSIX和Lua中,
匹配包括换行符在内的任何字符)

如果您想匹配一个字符串,该字符串具有3个以上的属性,您应该使用

local pattern = 'name="([^"]*)"%s+value="([^"]*)"%s+checked="checked"'
为什么不
[^\r\n]-
?因为如果一行上有两个标记,第一个具有第一个和/或第二个属性,第二个具有第二个和第三个或第二个属性(即使有第三个标记具有第三个属性,而第一个标记包含前两个属性),也会有匹配,如
[^\r\n]
匹配
,并且可以在标签上“过火”

请注意,
[^”]*
,一个反括号表达式,将只匹配0+个字符,而不是
,从而将匹配限制在一个标记内

见:


pattern='name=“([^”]*)value=“([^”]*)checked=“checked”
谢谢您,现在它工作得很好。如果第一项未选中(没有
checked=“checked”
),第二项已选中,您就会看到问题。对;然后需要按照@EgorSkriptunoff之前的建议,在模式中禁止新行或引号。
2[access comments]  access comments
3[administer comments]  administer comments
local pattern = 'name="([^"]*)"%s+value="([^"]*)"%s+checked="checked"'
local rx = 'name="([^"]*)"%s+value="([^"]*)"%s+checked="checked"'
local s = '<li name="n1"\nvalue="v1"><li name="n2"\nvalue="v1" checked="checked"><li name="n3"\nvalue="v3"   checked="checked">'
for name, value in string.gmatch(s, rx) do
  print(name, value)
end
n2  v1
n3  v3