Lua模式类似于正则表达式的正向预查?

我有一个字符串,其中可以包含任意数量的分隔符 '§\n'。我想从字符串中删除所有的分隔符,除了最后一个出现的分隔符应该保留原样。最后一个分隔符可以处于三种状态:'\n'、'§\n'或'§§\n'。最后一个可变分隔符后面永远不会有任何字符。

以下是具有不同状态的分隔符的3个示例:

abc§\ndef§\nghi\n
abc§\ndef§\nghi§\n
abc§\ndef§\nghi§§\n

我想删除所有分隔符,除了最后一次出现。

因此,上述三个示例的gsub结果应为:

abcdefghi\n
abcdefghi§\n
abcdefghi§§\n

使用正则表达式,可以使用'§\n(?=.)',使用正向预查正确匹配所有三种情况,因为最后一个可变分隔符后永远不会有任何字符。

我知道我可以检查字符串结尾是否有分隔符,然后在使用Lua模式'§\n'进行替换后,将分隔符重新添加到字符串中。但是,这是一个非常不优雅的解决方案,应该能够仅使用Lua模式解决此问题。

因此,如何使用Lua模式进行操作呢?

点赞
用户3512592
用户3512592

所以如果我理解正确,你想要一个正则表达式替换来使第一个示例看起来像第二个。这个:

/(.*?)§\\n(?=.*\\n)/g

将在 PCRE 中删除非最后一个分隔符,当替换为

$1

至少应该是这样的。我不确定 Lua 遵循什么风格,但你可以在[这里看到示例]。 (http://regex101.com/r/gP7bG3)

正则表达式:

/(.*?)§\\n(?=.*\\n)/g

测试字符串:

abc§\ndef§\nghi\n abc§\ndef§\nghi§\n abc§\ndef§\nghi§§\n

替换:

$1

结果:

abcdefghi\n abcdefghi§\n abcdefghi§§\n

2014-06-19 13:14:15
用户199201
用户199201

str:gsub('§\\n(.)', '%1')会实现你所需要的功能。它会删除分隔符,只要它后面跟着另一个字符,那么这个字符会被放回到字符串中。

测试代码

local str = {
    'abc§\\ndef§\\nghi\\n',
    'abc§\\ndef§\\nghi§\\n',
    'abc§\\ndef§\\nghi§§\\n',
}

for i = 1, #str do
    print( ( str[ i ]:gsub( '§\\n(.)', '%1' ) ) )
end

输出结果

abcdefghi\n
abcdefghi§\n
abcdefghi§§\n
2014-06-19 13:55:46