我一直在玩这个小时或拖曳,并发现自己在路障与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 i忘记了堆叠式流体的格式化)(另一个编辑以做一个非HTML示例,因为这导致了我试图解析HTML的假设)

有帮助吗?

解决方案

试图匹配逃脱的情况,使用正则表达式的引用文本就像试图使用割草机从田野上删除雏菊(和仅戴斯)。

我做了一个获得我想要的比赛的功能

这是正确的举动。

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

从实际的角度来看 即使模式可以做到这一点,您也不想这样做。 从理论的角度来看,您正在尝试找到一个均匀数量的后斜切之前的双引号。这绝对是一种常规语言,您想要的正则表达方式将是以下内容(Lua引用约定)

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

引用的字符串将是结果#2。但是LUA模式是 不是 完整的正则表达式;特别是,您不能放 * 经过括号的模式。所以 我的猜测是,无法使用LUA模式解决此问题, 但是,由于LUA模式在自动机理论中不是标准的事情,因此我不知道您可以用来证明这一点的任何证明技术。

其他提示

逃脱引号的问题是,通常,如果报价前有奇数的后斜线,则它被逃脱了,如果有一个偶数的数字,则不是。我不认为LUA模式匹配功能足以表示这种情况,因此,如果您需要像这样解析文本,那么您应该寻求另一种方式。也许您可以迭代字符串并解析它,或者您可以依次找到每个引用,然后向后读取,数量斜切,直到找到一个非背心斜拉字符(或字符串的开始)。

如果您绝对必须出于某种原因使用模式,则可以尝试在多步骤过程中进行此操作。首先,GSUB连续两个后斜线的所有出现,并用一些前哨值替换它们。这 必须 成为字符串中尚未发生的值。如果您知道此字符串不包含不可打印的字符,则可以尝试“ 001”之类的东西。无论如何,一旦您替换了连续两个后斜线的所有序列,剩下的任何后斜线都将逃脱以下字符。现在,您可以应用原始图案,然后最后您可以再次用两个后斜线替换前哨价值的所有实例。

LUA的图案语言足以适应许多简单的情况。它至少有一个技巧在典型的正则表达式包中找不到:匹配平衡括号的方法。但是它也有其限制。

当超过这些限制时,我就可以 LPEG. 。 LPEG是 解析表达语法 对于卢阿(Lua),由LUA的一位原始作者实施,因此对Lua的改编做得很好。 PEG允许编写从简单模式到完整语言语法的任何内容。 LPEG将语法编译为字节码,并非常有效地执行它。

你应该 不是 试图用正则表达式解析HTML,HTML和XML为 不是 普通语言,无法通过正则表达方式成功操纵。您应该使用专用的HTML解析器。 这里有很多解释.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top