如何将此正则表达式简化以适应Lua?

我正在尝试编写一个正则表达式,它能够捕获可能以字母“c”结尾的最长字符串,在Lua中使用。例如:

  • 给定“abc”,匹配“ab”
  • 给定“acc”,匹配“ac”
  • 给定“abcd”,匹配“abcd”
  • 给定“abd”,匹配“abd”

我想到的解决方案是“^(.+(?=c$)|.+(?!c$))”。然而,Lua 不支持 lookahead,因此我想知道是否有一种方法将其简化为 Lua 本身支持的内容。

点赞
用户1442917
用户1442917

你可以使用 (string.match(str:reverse(), "^c(.+)") or str:reverse()):reverse()。如果没有匹配到任何内容,则返回原始字符串。

[已更新以修复逻辑]

2021-07-30 02:01:21
用户7396148
用户7396148

你可以使用 "s:match("([^c]+c?[^c]*)c$") or s 这个表达式,它会匹配所有的非 c 字符和可能的一个 c,紧接着是任意的非 c 字符,如果末尾有 c,则匹配上最后一个 c,如果没有匹配,就返回整个字符串。

这是一个例子:

strs = {
  "abc",
  "acc",
  "abd",
  "abcd",
}

for _,s in ipairs(strs) do
  print(s, s:match("([^c]+c?[^c]*)c$") or s)
end

输出:

abc    ab
acc    ac
abd    abd
abcd   abcd
2021-07-30 02:52:18
用户5424988
用户5424988

您可以使用捕获组来捕获除了 c 之外的任何字符的 1 个或多个出现,后跟可选的 c 字符。

然后匹配字符串末尾的 c 字符,但不在括号组内。

([^c]+c*)c$

该模式可以匹配:

  • ( 捕获 组1
    • [^c]+c* 匹配 1 次或多次除 c 之外的任何字符,后跟可选的 c 字符
  • ) 关闭组1
  • c$ 匹配字符串末尾的 c 字符

Regex 演示

在代码中,如果存在组1,则可以打印组1的值,否则打印整个字符串。

我没有 Lua 经验,但是看到 @Nifim 发布的代码(并借用它进行示例)会匹配:

strs = {
  "abc",
  "acc",
  "abd",
  "abcd",
  "c"
}

for _,s in ipairs(strs) do
  print(s:match("([^c]+c*)c$") or s)
end

输出结果:

ab
ac
abd
abcd
c
2021-07-30 08:51:37
用户153133
用户153133

我认为 Egor Skriptunoff 在这个评论中提供了最佳答案。由于他没有将其作为专门的答案留下来,我将为他关闭此问题。我不持有任何信用。

原始答案:

s:match("(.-)c?$")
2021-08-03 03:30:53