为什么string.find返回整个模式的索引,而不是第一次捕获?

时间:2014-02-16 18:14:42

标签: lua lua-patterns

我想知道这段代码的行为:

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有绝对的掌握:实际上没有这种情况导致严重的问题吗?

1 个答案:

答案 0 :(得分:2)

捕获是匹配的副产品。即使你给了一个捕获的图案,你仍然有兴趣匹配整个模式。换句话说,匹配回答了问题:给定字符串中的哪个地方出现了这个子文本?捕获只是关于匹配的额外信息。

string.find返回匹配的位置,以允许您(例如)在匹配后继续解析字符串,可能使用不同的模式。