Шаблон \d{3}(?=.*(?!\d{3})string)
соответствует любым 3 цифрам, за которыми следуют любые 0+ символов, а затем текст string
, который не начинается с 3 цифр - что всегда верно, string
не начинаетсяс 3 цифрами.
Вы можете использовать
\d{3}(?!.*\d{3}.*string)(?=.*string)
Или, если 3-значные блоки должны соответствовать целым словам:
\b\d{3}\b(?!.*\b\d{3}\b.*string)(?=.*string)
Или - если эти3 цифры всегда должны быть заключены в пробелы
(?<!\S)\d{3}(?!\S)(?!.*(?<!\S)\d{3}(?!\S).*string)(?=.*string)
См. Демонстрационный пример regex
Здесь, после сопоставления трех цифр,
(?!.*\d{3}.*string)
- отрицательный прогноз означает, что нет 3 цифр, а затем string
в любом месте справа от текущего местоположения (?=.*string)
- положительный прогноз, требующий string
для появления в любом месте справа оттекущее местоположение.