引用文本的适当Lua模式是什么?

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

我暂时还会继续使用我的函数,但我很好奇是否有一种模式可以/应该使用,而我只是在模式方面遗漏了某些东西。

可能是RegEx匹配除XHTML自包含标签外的开放标签的重复问题。 - user177800
4个回答

5
尝试使用正则表达式匹配转义的引用文本就像使用割草机从田野中移除雏菊(仅限雏菊)一样困难。
我制作了一个可以获取所需匹配项的函数。
这是正确的做法。
我很好奇是否可以使用Lua模式来实现这个功能。从实际角度来看,即使模式可以做到这一点,你也不想这样做。从理论上讲,你正在尝试找到一个由偶数个反斜杠前导的双引号。这绝对是一个正则语言,你需要的正则表达式将类似于以下内容(Lua引用约定)。
[[[^\](\\)*"(.-[^\](\\)*)"]]

引用字符串将成为第二个结果。但是Lua模式不是完整的正则表达式;特别是,您不能在括号模式后面放置*

所以我的猜测是使用Lua模式无法解决这个问题,但由于Lua模式不是自动机理论中的标准事物,我不知道您可以使用哪种证明技术来证明它。


感谢Norman和Kevin,正是我期望并寻找的答案。 - Wolftousen

2
转义引号的问题在于,通常情况下,如果引号前有奇数个反斜杠,则它被转义,如果有偶数个,则不转义。我不认为Lua模式匹配足够强大以表示此条件,因此如果您需要解析这样的文本,则应寻找另一种方法。也许您可以遍历字符串并解析它,或者您可以依次找到每个引号并向后读取,计算反斜杠的数量,直到找到一个非反斜杠字符(或字符串的开头)。
如果您绝对必须出于某种原因使用模式,则可以尝试进行多步处理。首先,用gsub替换所有连续两个反斜杠的出现,并将它们替换为一些特殊值。这必须是字符串中不存在的值。如果您知道该字符串不包含不可打印的字符,则可以尝试使用“\001”之类的值。无论如何,一旦替换了所有连续两个反斜杠的序列,剩下的任何反斜杠都会转义其后面的字符。现在您可以应用原始模式,最后可以用两个反斜杠替换所有特殊值的实例。

1

Lua的模式语言对于许多简单情况是足够的。它至少有一个技巧,在典型的正则表达式包中找不到:一种匹配平衡括号的方法。但是它也有其限制。

当超出这些限制时,我就会使用LPeg。LPeg是Lua的解析表达式语法的实现,由Lua的原始作者之一实现,因此适应Lua非常好。PEG允许编写从简单模式到完整语言语法的任何规范。LPeg将语法编译为字节码并以极高的效率执行它。


0

你不应该尝试用正则表达式来解析 HTML,HTML 和 XML 不是正则语言,并且不能成功地使用正则表达式进行操作。你应该使用专用的 HTML 解析器。这里有很多解释为什么应该这样做


1
我并不关心HTML,那只是我从一个随机打开的文件中获取的测试字符串。我关心的只有引号。 - Wolftousen
那么,我建议使用一个非HTML的例子,并消除这种含糊不清的情况。 - user177800
你是否将 '" 视为相同的引号?如果是这样,那么你希望你的“未工作”的示例被解析成什么样子?例如,“"is' a" string" of' text" 包含重叠的引号。我们应该找到 "is' a"" of' text",还是 ' a" string" of',或者全部三个?如果是后者,你需要进行两次处理。 - Mud
(可以说是)最佳答案:https://dev59.com/X3I-5IYBdhLWcg3wq6do#1732454 - Alexander Gladysh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接