Используя PHP PCRE, вы можете сделать это:
/^([A-Za-z0-9]|([._%+-])(?!\2))*$/
\2
- это обратная ссылка, необходимая для обнаружения повторного использования одного и того же символа.Я не уверен, что это можно сделать без прямого утверждения и обратной ссылки, поэтому мое рабочее регулярное выражение проверено на:
'foo' => true,
'bar.baz' => true,
'bar.biz.buz' => true,
'bar.+bar' => true,
'bar..bar' => false,
'biz.baz..' => false,
'..++..' => false,
'.faf.' => true,