将POSIX正则表达式移植到Lua模式-意外结果
我很难将POSIX正则表达式移植到Lua字符串模式 我正在处理html响应,我想从中筛选复选框 检查过了。我特别感兴趣的是 每个复选框:将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
<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”
,它刚刚起作用
Pythonre
不兼容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