Aqui está uma regex que funciona bem na maioria das implementações de regex:
(?<!filename)\.js$
Corresponde a .js para uma sequência que termina com .js, exceto para filename.js
Javascript não tem regex lookbehind. Alguém pode montar um regex alternativo que atinja o mesmo resultado e funciona em javascript?
Aqui estão alguns pensamentos, mas precisa de funções auxiliares. Eu esperava conseguir isso apenas com um regex: http://blog.stevenlevithan.com/archives/mimic-lookbehind-javascript
javascript
regex
daniel
fonte
fonte
(?<=thingy)thingy
para olhar(?<!thingy)thingy
para trás e para negativo . Agora ele os suporta.Respostas:
^(?!filename).+\.js
funciona para mimtestado contra:
Uma explicação adequada para esse regex pode ser encontrada em Expressão regular para corresponder à string que não contém uma palavra?
O Look Forward está disponível desde a versão 1.5 do javascript e é suportado por todos os principais navegadores
Atualizado para corresponder a filename2.js e 2filename.js, mas não filename.js
(^(?!filename\.js$).).+\.js
fonte
a.js
2filename.js
, mas a regex fornecida aqui corresponde. Um mais apropriado seria^(?!.*filename\.js$).*\.js$
. Isso significa, corresponda a qualquer um,*.js
exceto*filename.js
.EDIT: A partir do ECMAScript 2018 em diante, as assertivas lookbehind (mesmo ilimitadas) são suportadas nativamente .
Nas versões anteriores, você pode fazer isso:
Isso faz explicitamente o que a expressão lookbehind está fazendo implicitamente: verifique cada caractere da sequência se a expressão lookbehind mais o regex depois que ela não corresponderá e só permita que esse caractere corresponda.
Outra edição:
Dói-me dizer (especialmente porque essa resposta foi tão votada) que existe uma maneira muito mais fácil de atingir esse objetivo. Não há necessidade de verificar a aparência de cada personagem:
funciona tão bem:
fonte
2filename.js
. Minha regex corresponde exatamente aos mesmos casos que a regex de exemplo.^(?!.*filename\.js$).*\.js$
funcionaria. Tentando pensar em situações em que o ncgroup ainda pode ser necessário ...Vamos supor que você queira encontrar tudo que
int
não é precedido porunsigned
:Com suporte para look-behind negativo:
Sem suporte para look-behind negativo:
Basicamente, a idéia é pegar n caracteres anteriores e excluir a correspondência com uma previsão negativa, mas também corresponder aos casos em que não há n caracteres anteriores. (onde n é o comprimento do look-behind).
Então, o regex em questão:
traduziria para:
Pode ser necessário brincar com a captura de grupos para encontrar o ponto exato da sequência que lhe interessa ou você não deseja substituir uma parte específica por outra.
fonte
(?<!barna)(?<!ene)(?<!en)(?<!erne) (?:sin|vår)e?(?:$| (?!egen|egne))
para(?!barna).(?!erne).(?!ene).(?!en).. (?:sin|vår)e?(?:$| (?!egen|egne))
qual faz o truque para minhas necessidades. Apenas fornecendo isso como outro cenário do "mundo real". Ver link((?!unsigned ).{9}|^.{0,8})int
Se você puder olhar para frente, mas para trás, poderá inverter a corda primeiro e, em seguida, dar uma olhada. Um pouco mais de trabalho precisará ser feito, é claro.
fonte
Esta é uma solução equivalente à resposta de Tim Pietzcker (veja também comentários da mesma resposta):
Significa, combinar
*.js
exceto*filename.js
.Para chegar a essa solução, você pode verificar quais padrões o negativo por trás exclui e depois excluir exatamente esses padrões com um negativo negativo.
fonte
Abaixo, há uma alternativa positiva ao JavaScript, mostrando como capturar o sobrenome das pessoas com 'Michael' como primeiro nome.
1) Dado este texto:
obter uma matriz de sobrenomes de pessoas chamadas Michael. O resultado deve ser:
["Jordan","Johnson","Green","Wood"]
2) Solução:
3) Verifique a solução
Demonstração aqui: http://codepen.io/PiotrBerebecki/pen/GjwRoo
Você também pode experimentá-lo executando o snippet abaixo.
fonte