gpt4 book ai didi

lua - 匹配没有连续连字符的字符串的 LPeg 模式

转载 作者:行者123 更新时间:2023-12-04 20:12:43 27 4
gpt4 key购买 nike

我正在尝试编写一个 LPeg 模式来匹配以下字符串:

  • 以字母开头
  • 此后包含字母数字字符
  • 不包含两个或多个连续的连字符(例如不允许 test--string)

作为引用,正则表达式 [a-zA-Z](-?[a-zA-Z0-9])*符合我正在寻找的内容。

这是我正在使用的代码,供引用:

require "lpeg"
P,R,C = lpeg.P,lpeg.R,lpeg.C

dash = P"-"
ucase = R"AZ"
lcase = R"az"
digit = R"09"
letter = ucase + lcase
alphanum = letter + digit

str_match = C(letter * ((dash^-1) * alphanum)^0)

strs = {
"1too",
"too0",
"t-t-t",
"t-t--t",
"t--t-t",
"t-1-t",
"t--t",
"t-one1",
"1-1",
"t-1",
"t",
"tt",
"t1",
"1",
}

for _,v in ipairs(strs) do
if lpeg.match(str_match,v) ~= nil then
print(v," => match!")
else
print(v," => no match")
end
end

然而,令我沮丧的是,我得到了以下输出:

1too     => no match
too0 => match!
t-t-t => match!
t-t--t => match!
t--t-t => match!
t-1-t => match!
t--t => match!
t-one1 => match!
1-1 => no match
t-1 => match!
t => match!
tt => match!
t1 => match!
1 => no match

无论代码输出什么,t-t--tt--t-tt--t 都不应该匹配。

最佳答案

在您的模式 letter * ((dash^-1) * alphanum)^0 中,lpeg 将尝试匹配字符串的前缀。对于您不希望匹配的情况

t-t--t
t--t-t
t--t

以粗体突出显示的部分是您的模式成功匹配的地方。 lpeg.match 返回最后一个位置(它是一个数字),如果没有捕获到任何内容,它能够解析到使用您的模式。对于上述 3 种情况,匹配的子部分被捕获,这解释了您看到的错误输出。

如果您只是一次匹配每个字符串,您可以修改您的模式以检查解析后是否没有剩余字符。

str_match = C(letter * ((dash^-1) * alphanum)^0) * -1

同样使用lpeg.re模块

re_pat = re.compile "{ %a ('-'? %w)* } !."

对于流匹配或查找目标字符串中的所有模式出现,像这样将语法规则堆叠在一起

stream_parse = re.compile
[[
stream_match <- ((str_match / skip_nonmatch) delim)* str_match?
str_match <- { %a ('-'? %w)* } (&delim / !.)
skip_nonmatch <- !str_match (!delim .)*

delim <- %s+
]]

任何匹配项都将被捕获并返回。如果没有匹配项,您将返回 nil 或一个指示模式在字符串中停止解析的位置的数字。

编辑:如果您需要解析在不匹配时返回 nil,这种对语法的调整应该可以解决问题

stream_parse = re.compile
[[
stream_match <- (str_match / skip_nonmatch+ &str_match)+
str_match <- { %a ('-'? %w)* } (&delim / !.)
skip_nonmatch <- !str_match (!delim .)* delim

delim <- %s+
]]

关于lua - 匹配没有连续连字符的字符串的 LPeg 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40189994/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com