Il est pratiquement impossible de répondre à cette question sans avoir une idée de ce que peut être le séparateur - quels caractères, combien de caractères, etc. Un séparateur arbitraire non gourmand ressemblerait à ceci :
s/\b1001\b(?=.*?\bjohn\b)/2001/
Il remplace "1001" lorsqu'il est suivi de "john" tout en respectant le nombre minimum de caractères intermédiaires. .*?
est la version non gourmande de .*
. Cependant, les expressions rationnelles correspondent toujours à ce qui est possible, donc ceci correspondrait toujours à ce qui suit
1001-mark-1001-john
En d'autres termes, il ne s'agit pas seulement d'un problème d'avidité. Nous devons définir au moins l'une des trois choses suivantes :
- Les caractères que le séparateur peut contenir.
- Les caractères le séparateur ne peut pas contenir.
- Le nombre de caractères du séparateur.
Si nous supposons que le séparateur ne peut pas contenir de caractères "word" (a-z, 0-9, et underscore), nous pouvons obtenir quelque chose de réalisable :
s/\b1001\b(?=\W+?\bjohn\b)/2001/
Les parties connues ("1001" et "john") sont bornées pour éviter qu'elles ne correspondent à d'autres chaînes avec ces sous-chaînes. (Merci à Chas d'avoir remarqué ce cas particulier).