2014-02-16 2 views
3

мне было интересно, о поведении этого кода:Почему 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: действительно ли нет случая, когда это вызывает серьезную проблему?

+2

Использовать пустые заголовки, чтобы получить позицию: 'print (str: match" a() (bc)() d ") - 2 bc 4' –

+0

Когда вы делаете это с' find', он возвращает позиции пустые захваты, но они возвращаются в виде захватов, поэтому он не меняет и не объясняет странное поведение. – Wutaz

+2

Используйте 'match' для захвата. Используйте 'find' для получения индексов и захватов. Просто не используйте 'find', если он не отражает ваши потребности. –

ответ

2

Захваты являются побочным продуктом соответствия. Даже когда вы даете паттен, который захватывает, вы по-прежнему заинтересованы в сопоставлении всего шаблона. Другими словами, сопоставление отвечает на вопрос: где в данной строке появляется этот подтекст? Захваты - это просто лишние биты информации о матче.

string.find возвращает местоположение совпадения, чтобы позволить вам (например) продолжить синтаксический анализ строки после матча, возможно, с другим шаблоном.

+0

Кажется, вы воссоздаете вопрос как утверждение. Я все еще не понимаю, почему кто-то хочет, чтобы функция вела себя так. Говорить мне, что я хочу, чтобы что-то не значит, что я это делаю. – Wutaz

 Смежные вопросы

  • Нет связанных вопросов^_^