You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

正则表达式/!(?!!*$)作用解析求助——Elixir编码挑战相关

嘿,我来帮你拆解这个正则表达式——它确实不是Elixir特有的,这是标准的PCRE风格正则,Elixir只是用~r/.../这个语法糖来定义正则而已,核心逻辑在任何支持正则前瞻的语言里都通用。

正则 !(?!!*$) 逐部分解析

咱们把这个正则拆成两个核心部分来看:

  • !:这是最基础的匹配规则,就是匹配单个感叹号字符,这是我们要定位的目标。
  • (?!!*$):这是一个负向前瞻断言(negative lookahead),用来排除不需要匹配的情况。咱们再把这个断言拆细:
    • !*:匹配0个或多个连续的感叹号
    • $:匹配字符串的末尾位置
      所以整个断言的意思是:当前位置的后面,不能是「任意数量的感叹号 + 字符串结尾」的组合
整体逻辑与示例验证

把两部分结合起来,这个正则的作用就是:匹配所有不在「字符串末尾连续感叹号序列」里的单个感叹号,这些被匹配到的感叹号会被String.replace替换为空字符串(也就是移除)。

结合你给出的示例来验证就更清楚了:

  1. 调用 Solution.remove("!Hi!!!") 返回 "Hi!!!"
    • 开头的!后面跟着H,不满足「感叹号+结尾」的条件,所以被匹配并移除;
    • 末尾的三个!,它们的后面就是字符串结尾,完全符合!*$的情况,所以不会被匹配,保留了下来。
  2. 调用 Solution.remove("Hi!") 返回 "Hi!"
    • 这里的!直接在字符串末尾,属于「感叹号+结尾」的场景,不会被匹配,所以保留。
  3. 调用 Solution.remove("Hi") 返回 "Hi"
    • 字符串里没有感叹号,正则找不到匹配项,自然什么都不会改变。
补充:Elixir的正则语法

顺便提一句,Elixir里的~r/.../只是定义正则的字面量写法,和JavaScript里的/.../、Python里的r'...'是一个意思,正则本身的逻辑和语法都是标准的,你完全可以把这个正则拿到其他支持前瞻断言的语言里使用,只需要调整语言特有的正则定义语法就行。

内容的提问来源于stack exchange,提问作者Iggy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:39:08