В общем случае вы, вероятно, не можете. Самый простой подход - сопоставить все и использовать обратные ссылки, чтобы получить интересующую часть:
Foo\s+(Bar)\s+Baz
Это не то же самое, что не включать окружающий текст в совпадение. Это, вероятно, не имеет значения, если все, что вы хотите сделать, - это извлечь "Bar", но будет иметь значение, если вы сопоставляете одну и ту же строку несколько раз и хотите продолжить с того места, где остановилось предыдущее соответствие.
Осмотр будет работать в некоторых случаях. Предложение Томалака:
(?<=Foo\s)Bar(?=\sBaz)
работает только для просмотра с фиксированной шириной (по крайней мере, в Perl). Начиная с Perl 5.10, утверждение \K
может использоваться для эффективного обеспечения просмотра переменной ширины:
Foo\s+\KBar(?=\s+Baz)
, который должен быть способен выполнять то, о чем вы просили во всех случаях, но потребует, чтобы вы реализовали это в Perl 5.10.
Хотя это было бы удобно, для завершения сопоставленного текста нет эквивалента \K
, поэтому вам нужно использовать упреждающий просмотр.