我正在研究一些需要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特有的。我知道!*$
表示在字符串末尾有零个或多个!
。整个正则表达式用简单的英语做什么?
此外:
?!
...做什么? (我认为?
表示零或更多,但为什么它在感叹号之前呢?)
为什么在括号!(
...之前有感叹号?
答案 0 :(得分:2)
这是负面的预测。也许看看https://www.regular-expressions.info/lookaround.html,这很好地解释了这一切。当然,它也在这个网站上被覆盖,但我想要搜索'?!'并不总是产生结果:Understanding negative lookahead
所以简单的英文就是“!” 不后跟“!* $”,其中这些字符恰好代表您上面写的内容。