如何使用regex-applicative库移除字符串指定后缀?
用regex-applicative库仅移除字符串结尾的指定后缀
你的问题出在之前的正则模式没有限制.end必须出现在字符串末尾——some anySym <* ".end"会匹配任何后面跟着.end的字符序列,哪怕.end后面还有其他内容。
要实现仅移除结尾.end的需求,你需要用end组合子来明确匹配输入的结束位置,确保.end之后没有多余字符。
正确代码
import Text.Regex.Applicative removeEndSuffix :: String -> String removeEndSuffix = replace (many anySym <* string ".end" <* end)
代码说明
many anySym:匹配任意数量(包括0个)的任意字符,对应.end之前的部分<* string ".end":确保前面的字符序列后紧跟字面量.end<* end:强制匹配到输入的结束位置,保证.end是字符串的最后一部分replace函数会将整个匹配到的字符串(前缀+.end)替换为many anySym捕获的前缀;如果字符串不以.end结尾,正则模式不匹配,replace会直接返回原字符串
测试效果:
- 输入
"start.end"→ 返回"start" - 输入
"start.end.extra"→ 返回原字符串"start.end.extra" - 输入
".end"→ 返回空字符串 - 输入
"test"→ 返回原字符串"test"
内容的提问来源于stack exchange,提问作者RandomB
相关产品推荐
相关产品推荐

