мне было интересно, о поведении этого кода:Почему string.find возвращает индексы всего шаблона, а не первого захвата?
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: действительно ли нет случая, когда это вызывает серьезную проблему?
Использовать пустые заголовки, чтобы получить позицию: 'print (str: match" a() (bc)() d ") - 2 bc 4' –
Когда вы делаете это с' find', он возвращает позиции пустые захваты, но они возвращаются в виде захватов, поэтому он не меняет и не объясняет странное поведение. – Wutaz
Используйте 'match' для захвата. Используйте 'find' для получения индексов и захватов. Просто не используйте 'find', если он не отражает ваши потребности. –