【问题标题】:What is the proper Lua pattern for quoted text?引用文本的正确 Lua 模式是什么?
【发布时间】:2011-05-18 01:37:59
【问题描述】:

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

【问题讨论】:

标签: lua escaping lua-patterns


【解决方案1】:

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

我创建了一个函数来获取我想要的匹配项

这是正确的举动。

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

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

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

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

【讨论】:

  • 感谢诺曼和凯文,正是我期待和寻找的答案。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      你应该尝试用正则表达式解析 HTML,HTML 和 XML 是 NOT 正则语言,不能用正则表达式成功操作。您应该使用专用的 HTML 解析器。 Here are lots of explanations why.

      【讨论】:

      • 我不能对 html 大意,这只是我从打开的随机文件中抓取的测试字符串。我只关心引号
      • 那么我建议使用非 HTML 示例并消除歧义
      • 您是否将'" 视为引号?如果是这样,您希望如何解析您的“不工作”示例?例如,"is' a" string" of' text" 包含重叠的引号。我们应该找到"is' a"" of' text",还是' a" string" of',还是三者都有?如果是后者,则需要分两次执行。
      • (可以说)THE 答案:stackoverflow.com/questions/1732348/…
      猜你喜欢
      • 2016-12-16
      • 2023-03-07
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多