我想知道这段代码的行为:
str = "abcd"
print( str:find"a(bc)d" ) -- prints 1 4 bc
print( str:find"(ab)cd" ) -- prints 1 4 ab
尽管两条线都在寻找并返回不同的字符串,但它们返回相同的索引,因为它们具有相同的引用框架。换句话说,在计算索引时会忽略捕获,但是它们会正常返回。
我最初的问题是关于出了什么问题,但后来我看到the manual actually indicates that this is proper behavior(虽然它不是很清楚)。
问题在于我试图找到基于它附近标记的东西,而没有返回该标记的位置。我期望string.find
返回第一次捕获的位置,如果有的话,所以我只是用括号包裹了我想要的位置。显然,这没有任何帮助。我找到了一个不同的(也是更好的)解决方案,但我认为这总是不可能或不方便。
string.find
有这样的行为吗?用户有什么特别的好处吗?如果你对Lua有绝对的掌握:实际上没有这种情况导致严重的问题吗?
答案 0 :(得分:2)
捕获是匹配的副产品。即使你给了一个捕获的图案,你仍然有兴趣匹配整个模式。换句话说,匹配回答了问题:给定字符串中的哪个地方出现了这个子文本?捕获只是关于匹配的额外信息。
string.find
返回匹配的位置,以允许您(例如)在匹配后继续解析字符串,可能使用不同的模式。