Почти невозможно ответить на этот вопрос, не имея представления о том, каким может быть разделитель - какие символы, сколько символов и т. Д. Нежадный произвольный разделитель будет выглядеть следующим образом:
s/\b1001\b(?=.*?\bjohn\b)/2001/
Заменяет «1001», когда следует «Джон», при совпадении с минимальным количеством промежуточных символов. .*?
- это не жадная версия .*
. Однако регулярные выражения всегда совпадают, если это возможно, поэтому это все равно будет соответствовать
1001-mark-1001-john
Другими словами, это не просто проблема жадности. Нам нужно определить хотя бы одну из трех вещей:
- Символы, которые разделитель может содержать.
- Символы, которые разделитель не может содержать .
- Количество символов в разделителе.
Если предположить, что разделитель не может содержать символы «слова» (a-z, 0-9 и подчеркивание), мы можем получить что-то работающее:
s/\b1001\b(?=\W+?\bjohn\b)/2001/
Известные части ("1001" и "john") ограничены, чтобы помешать им сопоставлять другие строки с этими подстроками. (Спасибо Часу за то, что он заметил этот крайний случай.)