How to negate / escape a show rule?

The answer of @bluss is pretty well, but if u dont’t want to call the function nonunderline() every where, try:

#show link: it => {
  let b = it.body.text
  if b.at(-1) == "-" {
    show underline: u => u.body
    link(it.dest, b.slice(0,-1))}
  else {
    underline(it)}}

#link("https://www.a.com")[Web A]
#link("https://www.b.com")[Web B-]

As for general show/set rule escaping, see: