A ideia é interessante.
Só um detalhe: em vez de "antes" e "depois", eu preferiria fazer tudo sequencial mesmo.
Até porque em regex existem o lookbehind e lookahead, que servem para verificar se algo existe antes ou depois (e eu até imaginei que seria isso), mas eles tem uma semântica diferente, porque só verificam, mas não fazem parte do match.
Se não for isso, simplesmente coloque as coisas na sequência.
E em vez de to_string
, ele já poderia gerar um objeto RegExp
mesmo.
const email_regex = RegexConstrutor()
.mais_que_ou(5, RegexTipos.nao_espaco)
.contenha('@')
.contenha_algum('gmail', 'hotmail')
exatamente('.com')
// o build cria a instância de RegExp, com as flags indicadas
.build(RegexFlags.CASE_INSENSITIVE, RegexFlags.GLOBAL); // equivale às flags "ig"
// por ser um RegExp, já posso usar direto
if (email_regex.test(some_string)) {
// etc...
}
Sei que não é o foco da pergunta, mas não posso deixar de alertar que esta regex dá match em vários emails inválidos (como por exemplo, [email protected]
e @@@@@@gmail.com
).
E eu só colocaria o \S
entre parênteses se a pessoa escolher explicitamente criar um grupo de captura. Quanto a contenha_algum
, poderia ter a opção de criá-lo como um grupo de não-captura (ou seja, ficaria \S{5,}@(?:gmail|hotmail).\S+
).
Outras adições são o comeca_com
(aí adiciona o ^
) e termina_com
(adiciona o $
).