Sequência de correspondência RegExp não começando com meu

93

Para o PMD, gostaria de ter uma regra que me avisasse sobre as variáveis ​​feias que começam com my.
Isso significa que tenho que aceitar todas as variáveis ​​que NÃO começam com my.

Portanto, preciso de um RegEx (re) que se comporte da seguinte maneira:

re.match('myVar')       == false
re.match('manager')     == true
re.match('thisIsMyVar') == true
re.match('myOtherVar')  == false
re.match('stuff')       == true

Tentei vários, mas ainda não fiz funcionar.

Dominik Sandjaja
fonte
1
Acho que na verdade deveria ser um olhar negativo para trás (não um olhar negativo para a frente).
Indrit

Respostas:

43

Você pode usar uma afirmação antecipada como outros sugeriram. Ou, se você quiser apenas usar a sintaxe de expressão regular básica:

^(.?$|[^m].+|m[^y].*)

Corresponde a strings que têm zero ou um caractere ( ^.?$) e, portanto, não podem ter my. Ou strings com dois ou mais caracteres onde quando o primeiro caractere não for um, mmais caracteres podem seguir ( ^[^m].+); ou se o primeiro caractere for um m, não deve ser seguido por um y( ^m[^y]).

quiabo
fonte
Este é o que poderíamos usar agora. Parece que há um problema com a regexp estendida, mas esta funciona bem por enquanto.
Dominik Sandjaja
169
^(?!my)\w+$

Deveria trabalhar.

Ele primeiro garante que não é possível fazer a correspondência myno início da string e, em seguida, faz a correspondência de caracteres alfanuméricos até o final da string. Espaços em branco em qualquer lugar da string farão com que a regex falhe. Dependendo da sua entrada, você pode remover os espaços em branco na frente e atrás da string antes de passá-la para a regex ou usar adicionar correspondências de espaço em branco opcionais à regex ^\s*(?!my)(\w+)\s*$. Nesse caso, a referência anterior 1 conterá o nome da variável.

E se você precisar garantir que o nome da variável comece com um certo grupo de caracteres, por exemplo [A-Za-z_], use

^(?!my)[A-Za-z_]\w*$

Observe a mudança de +para *.

Tim Pietzcker
fonte
63
/^(?!my).*/

(?!expression)é uma antevisão negativa; corresponde a uma posição onde expression não corresponde a partir dessa posição.

Âmbar
fonte
7

Não seria significativamente mais legível fazer uma correspondência positiva e rejeitar essas cadeias de caracteres - em vez de corresponder à negativa para encontrar cadeias de caracteres para aceitar?

/^my/
Victor Bruno
fonte
4
Isso seria mais fácil, MAS (era) necessário para uma regra que verifica o código ao enviar para um repositório, portanto, a lógica não pode ser "revertida".
Dominik Sandjaja