我試圖寫一個LPEG模式來匹配字符串其中:LPEG模式相匹配的字符串不連續hypens
- 以字母開頭
- 後包含字母數字字符
- 不含有兩個或多個連續的連字符(例如不允許
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--t
,t--t-t
和t--t
不應該匹配。
採取在'((破折號仔細看看^ -1) * alphanum)^ 0'!你說「把最多一個破折號後跟一個字母數字的可能性分組,這一切都可能發生0次或更多次。」所以你的模式可能會在開頭的字母上失敗。 – Youka