Aqui está uma expressão regular que criei para usar em JavaScript:
var reg_num = /^(7|8|9)\d{9}$/
Aqui está outra sugestão de um membro da minha equipe.
var reg_num = /^[7|8|9][\d]{9}$/
A regra é validar um número de telefone:
- Deve ser de apenas dez números.
- O primeiro número deve ser 7, 8 ou 9.
(7|8|9)
e[789]
não são equivalentes, porque o primeiro captura, o último não.(?:7|8|9)
seria equivalente, por outro lado (acho que você sabe disso, é claro ...).[<<|>>|\]\]|\[\[]
. Por causa do contexto, sei que a regex está tentando corresponder a<<
ou>>
ou[[
ou]]
. Mas, pelo que você disse, deve ser igual<
ou>
ou[
ou]
. Se você usar|
entre[]
, os colchetes se comportam de maneira diferente?|
dentro de uma classe de caractere[...]
, a menos que você queira corresponder à barra vertical em si. Além disso, duplicar chars em uma classe de personagem não tem efeito - uma classe de personagem é uma lista de personagens e irá corresponder exatamente a um deles. Meu palpite é que você quer um grupo , que usa colchetes normais:(<<|>>|\]\]|\[\[)
O conselho de sua equipe é quase correto, exceto pelo erro que foi cometido. Depois de descobrir o porquê, você nunca mais esquecerá. Dê uma olhada neste erro.
O que isso faz:
^
e$
denota correspondências ancoradas, que afirmam que o subpadrão entre essas âncoras é a correspondência inteira. A string só corresponderá se o subpadrão corresponder à totalidade, não apenas a uma seção.()
denota um grupo de captura .7|8|9
indica a correspondência de qualquer um dos7
,8
ou9
. Ele faz isso com alternâncias , que é o que o operador de tubo|
faz - alternando entre alternâncias. Isso retrocede entre as alternâncias: Se a primeira alternância não for correspondida, o motor deve retornar antes que a localização do ponteiro se mova durante a correspondência da alternância, para continuar correspondendo à próxima alternância; Considerando que a classe de personagem pode avançar sequencialmente. Veja esta correspondência em um mecanismo regex com otimizações desativadas:\d{9}
corresponde a nove dígitos.\d
é um metacaractere abreviado, que corresponde a qualquer dígito.Veja o que ele faz:
^
e$
denota correspondências ancoradas também.[7|8|9]
é uma classe de personagem . Quaisquer caracteres a partir da lista7
,|
,8
,|
, ou9
podem ser combinados, assim o|
foi adicionado na forma incorreta. Isso corresponde sem retrocesso.[\d]
é uma classe de personagem que habita o metacaractere\d
. A combinação do uso de uma classe de caractere e um único metacaractere é uma má ideia, a propósito, já que a camada de abstração pode retardar a correspondência, mas este é apenas um detalhe de implementação e se aplica apenas a algumas implementações de regex. JavaScript não é um deles, mas torna o subpadrão um pouco mais longo.{9}
indica que a única construção anterior é repetida nove vezes no total.O regex ideal é
/^[789]\d{9}$/
, porque/^(7|8|9)\d{9}$/
captura desnecessariamente, o que impõe uma diminuição de desempenho na maioria das implementações de regex (javascriptacontece de ser um, considerando que a questão usa palavra-chavevar
no código, provavelmente é JavaScript). O uso dephpque roda em PCRE para correspondência preg irá otimizar a falta de retrocesso, no entanto, não estamos em PHP também, então usar classes em[]
vez de alternações|
dá bônus de desempenho, pois a correspondência não retrocede e, portanto, coincide e falha mais rápido do que usar seu expressão regular anterior.fonte
Os primeiros 2 exemplos atuam de maneira muito diferente se você os estiver SUBSTITUINDO por algo. Se você corresponder a este:
você substituiria 7 ou 8 ou 9 pela string vazia.
Se você combinar neste
você vai substituir
7
ou8
ou9
OU A BARRA VERTICAL !!!! pela string vazia.Eu só descobri isso da maneira mais difícil.
fonte
|
).