[Expressões regulares] String não deve ter determinada seqüência

Olá:

Estou fazendo um Script em Groovy em que varro os JSP’s em busca das tags cujo atributo “src” comece com a String “/WBCM/”. Em Expressão regular isso fica assim:

/<img.*src=['"]\/WBCM\/[^>]*>/

Isso retorna positivo para:

<img src="/WBCM/locais/imagens/nada.gif" alt="" width="21" height="1" border="0">
<img src="/WBCM/imagens/ico_xdb_off.gif" title="Exclui item" name="ico_x<bean:write name="autorizacao" property='id' />
<img src="/WBCM/imagens/plastic.gif" alt="" width="1" height="21" border="0">
<img src="/WBCM/imagens/web_inactivate.gif" title="Clique aqui para desativar este usuário" name="ico_x<bean:write name='oUsuario' property='id' />

(Por enquanto ignorem o fato de que nem sempre fecha)
E negativo para:

<img src="/webcomm/WBCM/AIT/consulta2aViaDetalhe.do?method=detalheCodeBars&code=<bean:write name="oDocumentoNotificacaoTO" property="codigoBarras" />
<img src="/webcomm/WBCM/AIT/consulta2aViaDetalhe.do?method=detalheCodeBarsLetras&code=<bean:write name="NumeroRH" />
<img src='<tiles:getAsString name="icone"/>

Bem, agora eu quero o contrário: tags cujo atributo “src” não comece com a String “/WBCM/”, o que retornaria o contrário dos resultados acima. Em nenhum lugar achei como fazer isso. Seja no javadoc da classe Pattern, seja aqui. Então “chutei” a seguinte expressão:

/<img.*src=['"][^(\/WBCM\/)][^>]*>/

Mas não funcionou como queria, pois do segundo de tags acima retornou positivo apenas para <img src=’<tiles:getAsString name=“icone”/>. Alguém tem idéia melhor?

Grato,

Dica: veja o que (?!) faz. É isso mesmo que você quer?

import java.util.regex.*;
import java.util.*;

class TesteExcetoWBCM {
    public static void main(String[] args) {
    String[] testes = {
"<img src=\"/WBCM/locais/imagens/nada.gif\" alt=\"\" width=\"21\" height=\"1\" border=\"0\">",
"<img src=\"/WBCM/imagens/ico_xdb_off.gif\" title=\"Exclui item\" name=\"ico_x<bean:write name=\"autorizacao\" property='id' />",
"<img src=\"/WBCM/imagens/plastic.gif\" alt=\"\" width=\"1\" height=\"21\" border=\"0\">",
"<img src=\"/WBCM/imagens/web_inactivate.gif\" title=\"Clique aqui para desativar este usuário\" name=\"ico_x<bean:write name='oUsuario' property='id' />",
"<img src=\"/webcomm/WBCM/AIT/consulta2aViaDetalhe.do?method=detalheCodeBars&code=<bean:write name=\"oDocumentoNotificacaoTO\" property=\"codigoBarras\" />",
"<img src=\"/webcomm/WBCM/AIT/consulta2aViaDetalhe.do?method=detalheCodeBarsLetras&code=<bean:write name=\"NumeroRH\" />",
"<img src='<tiles:getAsString name=\"icone\"/>",
    };
        String regexInvalida = "<img.*src=['\"](?!/WBCM/)[^>]*>";
        Pattern pat = Pattern.compile(regexInvalida, Pattern.CASE_INSENSITIVE);
        for (int i = 0; i < testes.length; ++i) {
            System .out .println ("{" + testes[i] + "} : " + pat.matcher(testes[i]).matches());
        }
    }
}

As expressões regulares básicas/extendidas não possuem recurso de negar uma sequencia. Vc pode negar uma lista de caracteres apenas.

Contudo, a implementação de ERs do Java suporta alguns recursos alem

Special constructs (non-capturing)
(?:X) X, as a non-capturing group
(?idmsux-idmsux) Nothing, but turns match flags on - off
(?idmsux-idmsux:X) X, as a non-capturing group with the given flags on - off
(?=X) X, via zero-width positive lookahead
b X, via zero-width negative lookahead[/b]
(?<=X) X, via zero-width positive lookbehind
b X, via zero-width negative lookbehind[/b]
(?>X) X, as an independent, non-capturing group

Bem, parece que o i[/i] está funcionando bem. Entretanto, reconheço que devo estudar isso com mais detalhes mais tarde.

Grato,

Para complementar, achei esse site em português. À parte o tom talvez excessivamente informal, ele se mostrou muito útil. Em especial a resposta à minha pergunta: Há como negar uma ou mais palavras, em apenas alguns aplicativos.