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
.