我有一个字符串,可以包含任意数量的分隔符§\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模式来完成呢?
答案 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)
因此,如果我理解正确,您需要正则表达式替换,以使第一个示例看起来像第二个。这样:
/(.*?)§\\n(?=.*\\n)/g
将消除非最后的分隔符
$1
。我不确定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