É possível usar NOT em uma expressão regular no TextMate?

22

Eu tenho um projeto Matlab no qual estou trabalhando no editor OSX TextMate. Eu preciso encontrar todas as instâncias de uma determinada palavra, digamos que seja "foo", que não seja precedida por um "." ou sucedido por um "/".

No entanto, não consigo encontrar nenhuma maneira de procurar expressões regulares definidas negativamente dessa maneira. Alguém sabe se é possível procurar algo como "A precedido por algo diferente de B"?

(O TextMate usa a biblioteca de expressões regulares Oniguruma de K. Kosako.)

Nagel
fonte

Respostas:

31

Você deseja usar este bit da sintaxe:

(?=subexp)         look-ahead
(?!subexp)         negative look-ahead
(?<=subexp)        look-behind
(?<!subexp)        negative look-behind

No seu caso, (?<!\.)foo(?!/)

m4573r
fonte
1
Impressionante! Eu negligenciei aqueles na documentação. Obrigado :)
Nagel
Esta é uma solução brilhante que também leva em consideração a ocorrência da palavra foono início ou no final do texto.
simhumileco 24/08/19
13

O ^ (circunflexo ou sinal de intercalação) dentro de colchetes nega a expressão. Então, encontrar um "foo" não precedido por um "." seria:

[^.]foo
Brian
fonte
deve ser (^|[^.])(foo)e também corresponde a um caractere extra.
Ctrl-alt-delor 20/09/12
Obrigado Brian! Esta é a variante que eu tentei inicialmente, mas eu errei a sintaxe e tentei ^ [\.] Em vez de [^ \.]: P
Nagel
1
Isso não vai funcionar. Você deseja todos os caracteres, exceto '.' o que significa 'qualquer personagem'. Você precisa escapar dela: (^ | [^ \.]) (
Foo