Se você quiser selecionar @ e até o primeiro , depois disso, precisará especificá-lo como @[^,]*,
Isso é @ seguido por qualquer número ( * ) de não-vírgulas ( [^,] ) seguido por uma vírgula ( , ).
Essa abordagem funciona como o equivalente a @.*?, , mas não para coisas como @.*?string , que é onde o que vem depois é mais do que um único caractere. Negar um personagem é fácil, mas negar strings em regexps é muito mais difícil .
Uma abordagem diferente é pré-processar sua entrada para substituir ou preceder o string com um caractere que não ocorre em sua entrada:
gsub(/string/, "&") # pre-process
gsub(/@[^]*string/, "")
gsub(//, "") # revert the pre-processing
Se você não puder garantir que a entrada não conterá seu caractere de substituição ( acima), uma abordagem é usar um mecanismo de escape:
gsub(//, "") # use as the escape character and escape itself as
# in case it's present in the input
gsub(//, "") # use as our maker character and escape it
# as in case it's present in the input
gsub(/string/, "&") # mark the "string" occurrences
gsub(/@[^]*string/, "")
# then roll back the marking and escaping
gsub(//, "")
gsub(//, "")
gsub(//, "")
Isso funciona para string s fixos, mas não para expressões regulares arbitrárias, como para o equivalente a @.*?foo.bar .