如何减少此正则表达式以适应 Lua?

How to reduce this regex to fit in Lua?

我正在尝试做一个正则表达式,在 Lua.

中捕获可能结束字母“c”之前的最长字符串

例如,

我想到的解决方案是^(.+(?=c$)|.+(?!c$))。但是,Lua 没有前瞻性,所以我在想是否有办法将其减少到 Lua 本身支持的东西。

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

[已更新以修复逻辑]

您可以使用 "s:match("([^c]+c?[^c]*)c$") or s,这将获取所有非 c 字符,然后可能是 c,后跟任何剩余的非 c 字符和最后的 c如果存在,如果不匹配它 returns 整个字符串。

这是一个例子:

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

您可以使用捕获组捕获除 c 后跟可选的 c 个字符之外的任何字符的 1 次以上出现。

然后在组外的字符串末尾匹配一个c字符。

([^c]+c*)c$

模式匹配

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

Regex demo

在代码中,如果第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

Egor Skriptunoff 提供了我认为的最佳答案 。由于他没有将其作为专用答案,因此我将为他关闭这个问题。我没有任何信用。

原回答:

s:match("(.-)c?$")