如何减少此正则表达式以适应 Lua?
How to reduce this regex to fit in Lua?
我正在尝试做一个正则表达式,在 Lua.
中捕获可能结束字母“c”之前的最长字符串
例如,
- 给定
abc
,匹配 ab
- 给定
acc
,匹配 ac
- 给定
abcd
,匹配 abcd
- 给定
abd
,匹配 abd
我想到的解决方案是^(.+(?=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
字符串末尾的聊天
在代码中,如果第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?$")
我正在尝试做一个正则表达式,在 Lua.
中捕获可能结束字母“c”之前的最长字符串例如,
- 给定
abc
,匹配ab
- 给定
acc
,匹配ac
- 给定
abcd
,匹配abcd
- 给定
abd
,匹配abd
我想到的解决方案是^(.+(?=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
字符
)
关闭组 1c$
匹配c
字符串末尾的聊天
在代码中,如果第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?$")