5

我已经玩了一个小时或两个小时,发现自己遇到了 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 的假设)

4

4 回答 4

5

尝试使用正则表达式匹配转义的引用文本,就像尝试使用割草机从田地中移除雏菊(并且仅是雏菊)一样。

我做了一个函数来获得我想要的匹配

这是正确的举动。

我很好奇lua模式是否可以做到这一点

从实际的角度来看,即使一个模式可以做到这一点,你也不想这样做。 从理论的角度来看,您试图找到前面有偶数个反斜杠的双引号。这绝对是一种正则语言,您想要的正则表达式如下所示(Lua 引用约定)

[[[^\](\\)*"(.-[^\](\\)*)"]]

引用的字符串将是结果#2。但是 Lua 模式不是完整的正则表达式;特别是,您不能*在带括号的模式之后放置 a。所以我的猜测是这个问题不能使用 Lua 模式来解决,但由于 Lua 模式在自动机理论中不是标准的东西,我不知道有任何证明技术可以用来证明它。

于 2010-12-01T03:05:12.883 回答
2

转义引号的问题在于,一般来说,如果引号前有奇数个反斜杠,那么它就会被转义,如果有偶数个,则不是。我不相信 Lua 模式匹配足够强大来表示这种情况,所以如果你需要像这样解析文本,那么你应该寻求另一种方式。也许您可以遍历字符串并解析它,或者您可以依次找到每个引号并向后阅读,计算反斜杠直到找到非反斜杠字符(或字符串的开头)。

如果出于某种原因您绝对必须使用模式,您可以尝试在多步骤过程中执行此操作。首先, gsub 用于连续出现两个反斜杠,并将它们替换为一些标记值。这必须是字符串中尚未出现的值。如果您知道此字符串不包含不可打印的字符,您可以尝试类似“\001”的内容。无论如何,一旦您连续替换了两个反斜杠的所有序列,剩下的任何反斜杠都会转义以下字符。现在您可以应用原始模式,最后您可以再次用两个反斜杠替换所有哨兵值实例。

于 2010-11-30T22:06:45.557 回答
1

Lua 的模式语言足以应付许多简单的情况。它至少有一个典型的正则表达式包中没有的技巧:一种匹配平衡括号的方法。但它也有其局限性。

当超出这些限制时,我会到达LPeg。LPeg 是 Lua 的Parsing Expression Grammer的实现,由 Lua 的一位原作者实现,因此对 Lua 的适应做得很好。PEG 允许对从简单模式到完整语言语法的任何内容进行规范。LPeg 将语法编译为字节码并极其高效地执行它。

于 2010-12-01T07:26:27.103 回答
0

应该尝试使用正则表达式解析 HTML,HTML 和 XML不是正则语言,无法使用正则表达式成功操作。您应该使用专用的 HTML 解析器。这里有很多解释为什么

于 2010-11-30T20:41:13.727 回答