É possível fazer algo assim?
var pattern = /some regex segment/ + /* comment here */
/another segment/;
Ou tenho que usar nova RegExp()
sintaxe e concatenar uma string? Eu preferiria usar o literal, pois o código é mais evidente e conciso.
javascript
regex
syntax
ausência de pálpebra
fonte
fonte
let regexSegment1 = String.raw`\s*hello\s*`
Respostas:
Aqui está como criar uma expressão regular sem usar a sintaxe literal da expressão regular. Isso permite que você faça a manipulação de string arbitrária antes que ela se torne um objeto de expressão regular:
Se você possui dois literais de expressão regular, é possível concatená-los usando esta técnica:
É apenas mais prolixo do que apenas ter a expressão um e dois sendo strings literais em vez de expressões regulares literais.
fonte
new RegExp(/(/.source + /.*/.source + /)?/.source);
parece não funcionar.expression_one
? Você quer dizerregex1
?Apenas concatenar aleatoriamente objetos de expressões regulares pode ter alguns efeitos colaterais adversos. Use o RegExp.source :
Isso também permitirá que você mantenha os sinalizadores de expressão regular de um RegExp anterior usando os sinalizadores RegExp padrão.
jsFiddle
fonte
RegExp.prototype.flags
Não concordo totalmente com a opção "eval".
dará "// abcd // efgh //", que não é o resultado pretendido.
Usando fonte como
dará "/ abcdefgh /" e isso está correto.
Logicamente, não há necessidade de AVALIAR, você conhece sua EXPRESSÃO. Você só precisa da sua FONTE ou de como ela está escrita, não necessariamente do seu valor. Quanto aos sinalizadores, você só precisa usar o argumento opcional de RegExp.
Na minha situação, eu corro na questão de ^ e $ sendo usados em várias expressões que estou tentando concatenar juntos! Essas expressões são filtros gramaticais usados em todo o programa. Agora não quero usar alguns deles juntos para lidar com o caso de PREPOSIÇÕES. Talvez eu precise "cortar" as fontes para remover o início e o final ^ (e / ou) $ :) Saúde, Alex.
fonte
var regex = "\.\..*"
Problema Se o regexp contiver grupos de correspondência retroativa como \ 1.
Então apenas contatenar as fontes não funcionará. De fato, a combinação dos dois é:
A solução: primeiro, contamos o número de grupos correspondentes no primeiro regex; depois, para cada token de correspondência retroativa no segundo, incrementamos o número de grupos correspondentes.
Teste:
fonte
function concatenateList() { var res = arguments[0]; for(var i = 1; i < arguments.length; i++) { res = concatenate(res, arguments[i]); } return res; }
Seria preferível usar a sintaxe literal o mais rápido possível. É mais curto, mais legível e você não precisa de aspas de escape ou de escapes duplos. De "Padrões Javascript", Stoyan Stefanov 2010.
Mas usar Novo pode ser a única maneira de concatenar.
Eu evitaria avaliar. Não é seguro.
fonte
Fornecendo:
/this/g
do quenew RegExp('this', 'g')
;Então você pode escrever desta maneira:
você pode fazer algo como:
No meu caso específico (um editor semelhante ao código-espelho), é muito mais fácil executar uma grande regex, em vez de muitas substituições como a seguir, sempre que eu substituo por uma tag html para quebrar uma expressão, o próximo padrão será ser mais difícil de segmentar sem afetar a própria tag html (e sem a boa aparência que infelizmente não é suportada em javascript):
fonte
Você poderia fazer algo como:
Os segmentos seriam seqüências de caracteres (em vez de literais de regex) passadas como argumentos separados.
fonte
Não, a maneira literal não é suportada. Você terá que usar o RegExp.
fonte
Use o construtor com 2 parâmetros e evite o problema de arrastar '/':
fonte
Você pode concat fonte de regex da classe literal e RegExp:
fonte
a maneira mais fácil para mim seria concatenar as fontes, ex .:
o valor c resultará em:
fonte
Eu prefiro usar
eval('your expression')
porque não adiciona o/
em cada extremidade/
que='new RegExp'
faz.fonte