Expressões regulares, como corresponder como verdadeiro se algo NÃO existir?

0

Eu sou bastante decente com expressões regulares, mas há uma situação que sempre me ajuda, ou seja: dê uma correspondência quando um padrão não existe em uma string de pesquisa.

Veja algumas informações básicas:

Eu uso um programa chamado Actual Tools Window Manager, e ele permite criar regras baseadas em janelas individuais. Eu posso especificar o título do Windows como uma string exata ou usar uma expressão regular para corresponder.

Meu objetivo é fazer esta regra disparar em qualquer janela que tenha um título que não inclua uma string específica. O regex é apenas um padrão, semelhante à função php: preg_match.

Eu não posso trabalhar com grupos de captura e me referir a um grupo de captura (pelo menos, não consegui fazer isso funcionar).

Como exemplo, digamos que eu queira criar uma regra que seja acionada em tudo, exceto quando o cmd.exe estiver no título.

Eu abro um prompt de comando, então é provável que o título tenha: C:\Windows\System32\cmd.exe Eu quero que essa janela seja excluída da minha regra com base na presença de cmd.exe

Eu tentei coisas como ^cmd.exe , mas isso simplesmente não funciona.

As Ferramentas Reais usam uma biblioteca de expressões regulares compatíveis com Perl, portanto, o link deve ser possível de alguma forma.

Como posso fazer um regex que combine OK se uma determinada string não estiver presente, mas FAIL se essa string estiver presente?

    
por LPChip 17.11.2017 / 09:55

1 resposta

1

Esta regex faz o trabalho:

^(?:(?!cmd\.exe).)*$

Explicação:

^               : begining of string
  (?:           : start non capture group
    (?!         : start negative lookahead
      cmd\.exe  : literally (you may add wordboundaries \bcmd\.exe\b if you don't want to match mycmd.exe)
    )           : end lookahead
    .           : 1 any character but newline
  )*            : end group, repeated 0 or more times
$               end of string

Exemplos:

C:\Windows\System32\cmd.exe         --> Doesn't match
C:\Windows\System32\mycmd.exe       --> Doesn't match without wordboundaries, else Match
C:\Windows\System32\cmd             --> Match
C:\Windows\System32\exe             --> Match
    
por 17.11.2017 / 11:29

Tags