我已经玩了一个小时或两个小时,并发现自己在Lua模式匹配实用程序的路障。我试图匹配字符串中的所有引用文本,并在需要时替换它。
到目前为止我提出的模式是:(\?[\“\'])(.-)%1
这在某些情况下有效,但并非所有情况:
Working: "This \"is a\" string of \"text to\" test with"
Not Working: "T\\\"his \"is\' a\" string\" of\' text\" to \"test\" wit\\\"h"
在不工作的例子中,我希望它与之匹配(我创建了一个能够获得我想要的匹配的函数,我只是在寻找一个与gsub一起使用的模式,如果一个lua模式可以做到这一点就很好奇):
string
a" string" of
is' a" string" of' text
test
his "is' a" string" of' text" to "test" wit
我将暂时继续使用我的功能,但我很好奇是否有我可以/应该使用的模式,我只是缺少模式的东西。
(一些编辑b / c我忘记了stackoverflows格式化) (另一个编辑来创建一个非html示例,因为它导致了我试图解析html的假设)
答案 0 :(得分:5)
尝试使用正则表达式匹配转义的引用文本就像尝试使用割草机从字段中删除雏菊(并且只是daises)。
我创造了一个能够获得我想要的比赛的功能
这是正确的举动。
我很好奇,如果一个lua模式可以做到这一点
从实际的角度来看,即使模式可以做到这一点,你也不愿意。从理论的角度来看,你试图找到一个双引号通过偶数个反斜杠。这绝对是一种常规语言,你想要的正则表达式如下(Lua引用约定)
[[[^\](\\)*"(.-[^\](\\)*)"]]
引用的字符串将是结果#2。但是Lua模式是不是完整的正则表达式;特别是,你不能在括号模式后加*
。
所以我的猜测是这个问题不能用Lua模式来解决,但由于Lua模式在自动机理论中不是标准的东西,我不知道你可以使用的任何证明技术体证明这一点。
答案 1 :(得分:2)
转义引号的问题在于,一般来说,如果在引号之前有一个奇数个反斜杠,那么它就会被转义,如果有一个偶数,那就不是。我不相信Lua模式匹配足以代表这种情况,所以如果你需要解析这样的文本,那么你应该寻求另一种方式。也许你可以遍历字符串并解析它,或者你可以依次找到每个引用并向后读,计算反斜杠直到你找到一个非反斜杠字符(或字符串的开头)。
如果由于某种原因绝对必须使用模式,您可以尝试在多步骤过程中执行此操作。首先,gsub连续出现两个反斜杠,并用一些sentinel值替换它们。此必须是字符串中尚未出现的值。如果您知道此字符串不包含不可打印的字符,您可以尝试类似“\ 001”的内容。无论如何,一旦你连续替换了两个反斜杠的所有序列,剩下的任何反斜杠都会逃避后面的字符。现在您可以应用原始模式,最后再次使用两个反斜杠替换所有Sentinel值的实例。
答案 2 :(得分:1)
Lua的模式语言适用于许多简单案例。它至少有一个你在典型的正则表达式包中找不到的技巧:一种匹配平衡括号的方法。但它也有其局限性。
超过这些限制时,我会到达LPeg。 LPeg是Lua的Parsing Expression Grammer的实现,由Lua的一位原作者实现,因此对Lua的适应性很好。 PEG允许指定从简单模式到完整语言语法的任何内容。 LPeg将语法编译为字节码并非常有效地执行它。
答案 3 :(得分:0)
你应该 NOT 尝试使用正则表达式解析HTML,HTML和XML NOT 常规语言,并且无法使用正则表达式成功操作。您应该使用专用的HTML解析器。 Here are lots of explanations why