Вы можете использовать следующее регулярное выражение (с установленным флагом безразличного регистра), которое должно работать с большинством каждого механизма регулярных выражений.
\b[a-km-z]*l(?:[a-km-z]+l)*[a-km-z]*\b
Демо
Механизм регулярных выражений выполняет следующие операции:
\b # match a word break
[a-km-z]* # match 0+ letters other than 'l'
l # match 'l'
(?: # begin non-capture group
[a-km-z]+ # match 1+ letters other than 'l'
l # match 'l'
) # end non-capture group
* # execute non-capture group 0+ times
[a-km-z]* # match 0+ letters other than 'l'
\b # match a word break
С PCRE (PHP) и некоторыми другими механизмами регулярных выражений вы можете использовать вызовы подпрограмм , чтобы уменьшить количество повторений и вероятность ошибок. Здесь это будет
\b([a-km-z])*l(?:(?1)+l)*(?1)*\b
или
\b(?P<allbutl>[a-km-z])*l(?:(?P>allbutl)+l)*(?P>allbutl)*\b
Использование подпрограммы с именованной группой захвата, когда содержание последней является сложным, также может улучшить читаемость. Я упоминаю это как общую информацию, и не обязательно защищаю использование подпрограммы здесь.