引用文本的正确 Lua 模式是什么?

我已经试了一两个小时了,发现自己在Lua模式匹配工具方面遇到了障碍。我正在尝试匹配字符串中的所有引用文本,并在需要时进行替换。

到目前为止,我想出来的模式是:(\?[\"\'])(.-)%1

这在某些情况下有效,但并非所有情况:

有效: "This \"is a\" string of \"text to\" test with"

无效: "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

目前我打算继续使用我的函数,但是我很好奇是否有模式我可以/应该使用,只是我可能错过了一些东西。

原文链接 https://stackoverflow.com/questions/4317308

点赞
stackoverflow用户88888888
stackoverflow用户88888888

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

2010-11-30 20:41:13
stackoverflow用户582
stackoverflow用户582

对于转义引号的问题,一般而言,如果引号前面有奇数个反斜杠,那么它就被转义了,如果有偶数个则没有。我不认为 Lua 的模式匹配足够强大以表示这个条件,因此如果您需要解析此类文本,则应寻找另一种方法。也许你可以遍历字符串并解析它,或者你可以依次找到每个引号并向后读取,计算反斜杠的数量,直到找到一个非反斜杠字符(或字符串的开头)。

如果您一定要出于某种原因使用模式,可以尝试使用多个步骤来完成。首先,用 gsub 替换所有连续两个反斜杠出现的情况,并用某个标志值替换它们。这个标志值一定要是字符串中不存在的值。如果你知道这个字符串不包含非可打印字符,可以尝试使用 "\001" 这样的值。不管怎样,一旦你替换了所有连续的两个反斜杠序列,剩下的反斜杠就是用来转义后面的字符的。现在你可以应用你原来的模式,最后你可以将所有标志值实例替换回两个反斜杠。

2010-11-30 22:06:45
stackoverflow用户41661
stackoverflow用户41661

使用正则表达式匹配转义、带引号的文本就像使用割草机仅割开雏菊一样困难。

我写了一个能得到我想要的匹配结果的函数。

这是正确的做法。

我好奇能否使用 Lua 模式来实现这个。

从实际角度看,即使模式能够实现,你也不想使用它。从理论角度看,你正试图找到一个由偶数个反斜杠前置的双引号。这绝对是一个正则语言,而你想要的正则表达式应该是像下面这样的(使用 Lua 引用约定):

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

被引用的字符串将成为结果 #2。但是 Lua 模式并不是完整的正则表达式,特别是在带括号的模式后面不能加上 *。 所以我猜这个问题不能使用 Lua 模式来解决,但由于 Lua 模式不是自动机理论的标准部分,我不知道你能否使用任何证明技术来证明它。

2010-12-01 03:05:12
stackoverflow用户68204
stackoverflow用户68204

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

当这些限制超出范围时,我会转向LPeg。LPeg是一个针对Lua的解析表达式语法的实现,并由Lua的原始作者之一实现,因此适应Lua的工作非常出色。PEG允许编写从简单模式到完整语言语法的任何内容的规范。LPeg将语法编译为字节码,并且执行效率非常高。

2010-12-01 07:26:27