正则表达式/!(?!!*$)作用解析求助——Elixir编码挑战相关
嘿,我来帮你拆解这个正则表达式——它确实不是Elixir特有的,这是标准的PCRE风格正则,Elixir只是用~r/.../这个语法糖来定义正则而已,核心逻辑在任何支持正则前瞻的语言里都通用。
正则
!(?!!*$) 逐部分解析 咱们把这个正则拆成两个核心部分来看:
!:这是最基础的匹配规则,就是匹配单个感叹号字符,这是我们要定位的目标。(?!!*$):这是一个负向前瞻断言(negative lookahead),用来排除不需要匹配的情况。咱们再把这个断言拆细:!*:匹配0个或多个连续的感叹号$:匹配字符串的末尾位置
所以整个断言的意思是:当前位置的后面,不能是「任意数量的感叹号 + 字符串结尾」的组合
整体逻辑与示例验证
把两部分结合起来,这个正则的作用就是:匹配所有不在「字符串末尾连续感叹号序列」里的单个感叹号,这些被匹配到的感叹号会被String.replace替换为空字符串(也就是移除)。
结合你给出的示例来验证就更清楚了:
- 调用
Solution.remove("!Hi!!!")返回"Hi!!!"- 开头的
!后面跟着H,不满足「感叹号+结尾」的条件,所以被匹配并移除; - 末尾的三个
!,它们的后面就是字符串结尾,完全符合!*$的情况,所以不会被匹配,保留了下来。
- 开头的
- 调用
Solution.remove("Hi!")返回"Hi!"- 这里的
!直接在字符串末尾,属于「感叹号+结尾」的场景,不会被匹配,所以保留。
- 这里的
- 调用
Solution.remove("Hi")返回"Hi"- 字符串里没有感叹号,正则找不到匹配项,自然什么都不会改变。
补充:Elixir的正则语法
顺便提一句,Elixir里的~r/.../只是定义正则的字面量写法,和JavaScript里的/.../、Python里的r'...'是一个意思,正则本身的逻辑和语法都是标准的,你完全可以把这个正则拿到其他支持前瞻断言的语言里使用,只需要调整语言特有的正则定义语法就行。
内容的提问来源于stack exchange,提问作者Iggy
相关产品推荐
相关产品推荐

