Lua模式类似于regex积极前瞻?

时间:2014-06-19 12:47:16

标签: regex lua lua-patterns

我有一个字符串,可以包含任意数量的分隔符§\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模式来完成呢?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:-1)

编辑:这个答案并不适用于lua,但是如果你有类似的问题并且不受lua限制,那么你可以使用它。

因此,如果我理解正确,您需要正则表达式替换,以使第一个示例看起来像第二个。这样:

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

当用

替换时,

将消除非最后的分隔符

$1

至少在PCRE中

。我不确定Lua遵循的风格,但您可以看到示例in action here.

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

测试字符串:
abc§\ndef§\nghi\n abc§\ndef§\nghi§\n abc§\ndef§\nghi§§\n

代换:
$1

结果:
abcdefghi\n abcdefghi§\n abcdefghi§§\n