Eu tenho uma expressão regular muito longa, que desejo dividir em várias linhas no meu código JavaScript para manter cada comprimento de linha de 80 caracteres de acordo com as regras JSLint. É apenas melhor para leitura, eu acho. Aqui está uma amostra de padrão:
var pattern = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
javascript
regex
jslint
expression
readability
Nik Sumeiko
fonte
fonte
/\S+@\S+\.\S+/
?Respostas:
Você pode convertê-lo em uma sequência e criar a expressão chamando
new RegExp()
:Notas:
RegExp
aceita modificadores como um segundo parâmetro/regex/g
=>new RegExp('regex', 'g')
[ Adição ES20xx (modelo marcado)]
No ES20xx, você pode usar modelos com tags . Veja o trecho.
Nota:
\s
,\s+
,\s{1,x}
,\t
,\n
etc).fonte
new RegExp
é uma ótima maneira de expressões regulares de várias linhas. Em vez de ingressar em matrizes, você pode simplesmente usar um operador de concatenação de strings:var reg = new RegExp('^([a-' + 'z]+)$','i');
//
) e colá-la como o argumento de string no construtor RegExp. Isso ocorre porque os caracteres de barra invertida são consumidos ao avaliar a string literal . Exemplo:/Hey\sthere/
não pode ser substituído pornew RegExp("Hey\sthere")
. Em vez disso, deve ser substituído pornew RegExp("Hey\\sthere")
Observe a barra invertida extra! Por isso prefiro deixar apenas um longo literal regex em uma linha longaRegExp
uma maneira que é muito mais fácil de entender.Estendendo a resposta do @KooiInc, você pode evitar o escape manual de todos os caracteres especiais usando a
source
propriedade doRegExp
objeto.Exemplo:
ou se você quiser evitar repetir a
.source
propriedade, poderá fazê-lo usando aArray.map()
função:No ES6, a função de mapa pode ser reduzida para:
.map(r => r.source)
fonte
combineRegex = (...regex) => new RegExp(regex.map(r => r.source).join(""))
Uso:combineRegex(/regex1/, /regex2/, ...)
O uso de strings
new RegExp
é estranho porque você deve escapar de todas as barras invertidas. Você pode escrever regexes menores e concatená-las.Vamos dividir esse regex
Usaremos uma função para tornar as coisas mais bonitas mais tarde
E agora vamos agitar
Como tem um custo, tente criar o regex real apenas uma vez e use-o.
fonte
multilineRegExp([/a|b/, /c|d])
resulta em/a|bc|d/
, enquanto você quis dizer(a|b)(c|d)
.Há boas respostas aqui, mas, para ser completo, alguém deve mencionar o principal recurso de herança do Javascript com a cadeia de protótipos . Algo assim ilustra a idéia:
fonte
Graças ao maravilhoso mundo dos literais de modelo, agora você pode escrever expressões grandes, com várias linhas, bem comentadas e até semanticamente aninhadas no ES6.
Usando isso, agora você pode escrever regexes como este:
Saídas
Ou o que dizer de multilinhas?
Saídas
hel
, arrumado!"E se eu precisar realmente pesquisar uma nova linha?", Então use
\n
bobo!Trabalhando no meu Firefox e Chrome.
Ok, "que tal algo um pouco mais complexo?"
Claro, aqui está uma parte de um analisador de JS de destruição de objetos em que eu estava trabalhando :
Produz
/^\s*((\})|(?:[,{]\s*)(?:(\.\.\.)|(\b\d+\b|\b[A-Za-z$_][\w$]*\b|("|')(?:(?!\5|\\).|(?:\\.))*\5)\s*(:|)|\s*(?={)))((?:\s*(?:[,}\]=]|$)|\s*\}|\s*[{[:]|\s*[,}{]).*)$/
E executando-o com uma pequena demonstração?
Resultados com sucesso
Observe a captura bem-sucedida da sequência de caracteres citada.
Eu testei no Chrome e Firefox, funciona um prazer!
Se curioso, você pode conferir o que eu estava fazendo e sua demonstração .
Embora só funcione no Chrome, porque o Firefox não suporta referências anteriores ou grupos nomeados. Portanto, observe que o exemplo dado nesta resposta é na verdade uma versão castrada e pode ser facilmente enganado para aceitar cadeias inválidas.
fonte
O regex acima está faltando algumas barras pretas que não estão funcionando corretamente. Então, editei o regex. Por favor, considere este regex que funciona 99,99% para validação de email.
fonte
Para evitar a matriz
join
, você também pode usar a seguinte sintaxe:fonte
Pessoalmente, eu usaria uma regex menos complicada:
Claro, é menos preciso que o seu padrão atual, mas o que você está tentando realizar? Você está tentando detectar erros acidentais que seus usuários podem digitar ou está preocupado que eles possam tentar digitar endereços inválidos? Se for o primeiro, eu adotaria um padrão mais fácil. Nesse caso, alguma verificação ao responder a um email enviado para esse endereço pode ser uma opção melhor.
No entanto, se você quiser usar seu padrão atual, seria (IMO) mais fácil de ler (e manter!) Construindo-o a partir de sub-padrões menores, como este:
fonte
Você pode simplesmente usar a operação de string.
fonte
Tentei melhorar a resposta do korun encapsulando tudo e implementando o suporte para dividir grupos de captura e conjuntos de caracteres - tornando esse método muito mais versátil.
Para usar esse snippet, você precisa chamar a função variada
combineRegex
cujos argumentos são os objetos de expressão regular que você precisa combinar. Sua implementação pode ser encontrada na parte inferior.Os grupos de captura não podem ser divididos diretamente dessa maneira, pois isso deixaria algumas partes com apenas um parêntese. Seu navegador falharia com uma exceção.
Em vez disso, estou simplesmente passando o conteúdo do grupo de captura dentro de uma matriz. Os parênteses são adicionados automaticamente quando
combineRegex
encontra uma matriz.Além disso, os quantificadores precisam seguir algo. Se, por algum motivo, a expressão regular precisar ser dividida na frente de um quantificador, você precisará adicionar um par de parênteses. Estes serão removidos automaticamente. O ponto é que um grupo de captura vazio é bastante inútil e, dessa forma, os quantificadores têm algo a que se referir. O mesmo método pode ser usado para coisas como grupos que não capturam (
/(?:abc)/
torna-se[/()?:abc/]
).Isso é melhor explicado usando um exemplo simples:
se tornaria:
Se você precisar dividir conjuntos de caracteres, poderá usar objetos (
{"":[regex1, regex2, ...]}
) em vez de matrizes ([regex1, regex2, ...]
). O conteúdo da chave pode ser qualquer coisa, desde que o objeto contenha apenas uma chave. Observe que, em vez de()
você ter que usar]
como início fictício, se o primeiro caractere puder ser interpretado como quantificador. Ou seja,/[+?]/
torna-se{"":[/]+?/]}
Aqui está o trecho e um exemplo mais completo:
fonte
A ótima resposta de @ Hashbrown me colocou no caminho certo. Aqui está a minha versão, também inspirada neste blog .
Use-o assim:
Para criar este
RegExp
objeto:fonte