在正则表达式之前的问号?

时间:2018-03-24 16:10:21

标签: regex elixir

我正在研究一些需要Regex解决方案的Elixir编码挑战,并遇到以下代码:

defmodule Solution do
  def remove(some_string)
    String.replace(some_string, ~r/!(?!!*$)/, "")
  end
end

Solution.remove("!Hi!!!") #=> "Hi!!!"
Solution.remove("Hi!") #=> "Hi!"
Solution.remove("Hi") #=> "Hi"

删除不在最后的感叹号。

我的问题是,我不明白/!(?!!*$)/行的作用。我相信正则表达式的这一部分不是Elixir特有的。我知道!*$表示在字符串末尾有零个或多个!。整个正则表达式用简单的英语做什么?

此外:

?! ...做什么? (我认为?表示零或更多,但为什么它在感叹号之前呢?)

为什么在括号!( ...之前有感叹号?

1 个答案:

答案 0 :(得分:2)

这是负面的预测。也许看看https://www.regular-expressions.info/lookaround.html,这很好地解释了这一切。当然,它也在这个网站上被覆盖,但我想要搜索'?!'并不总是产生结果:Understanding negative lookahead

所以简单的英文就是“!” 后跟“!* $”,其中这些字符恰好代表您上面写的内容。