【问题标题】:Lua pattern similar to regex positive lookahead?Lua模式类似于正则表达式积极前瞻?
【发布时间】:2014-08-10 00:22:18
【问题描述】:

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

【问题讨论】:

  • 您用作分隔符的字符的 unicode / 名称是什么?
  • 字符串“§\n”(节符号后跟换行符)是分隔符。 Unicode:U+00A7 后跟 U+000A。
  • 我可能会先捕获最后的分隔符,将它们全部删除,然后将捕获的分隔符附加到末尾。
  • 我目前正在我的生产代码中这样做,但我想只使用 gsub 而不在之后附加分隔符。这不是一个 bad 解决方案,但我确信单独使用 gsub 可以做得更好,这就是我问这个问题的原因。

标签: regex lua lua-patterns


【解决方案1】:

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

【讨论】:

  • 我的意思是换行符 "\n" 或 (HEX) 0x0A 但我可以使用它。
  • 是的,我确实怀疑并使用\n 而不是\\n 测试了上述内容......
【解决方案2】:

编辑:此答案不适用于 lua,但如果您遇到类似问题并且不受 lua 限制,您可能可以使用它。

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

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

替换为

时将消除非最后的分隔符

$1

至少在 PCRE 中。我不确定 Lua 遵循什么风格,但你可以看例子in action here.

正则表达式:
/(.*?)§\\n(?=.*\\n)/g

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

替补:
$1

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

【讨论】:

  • 啊,我明白了。我以前从未使用过lua。不过,我会在此处保留答案,以防它对其他人有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多