haskell - Haskell - 如何对反斜杠字符进行模式匹配?
问题描述
我想用使用模式匹配的递归函数用字符串中的空格替换 \n,但我不知道如何匹配 \ 字符。
这是我的功能:
replace :: String -> String
replace ('\\':'n':xs) = ' ' : replace xs
replace (x:xs) = x : replace xs
replace "" = ""
在('\':'n':xs)
反斜杠中会转义单引号并弄乱代码,所以我写('\\':'n':xs)
期望第一个 \ 将转义第二个 \ 并匹配字符串中的反斜杠。然而,事实并非如此。
这就是我在 GHCi 中尝试该功能时发生的情况:
*Example> replace "m\nop"
"m\nop"
*Example> replace "m\\nop"
"m op"
如何匹配单个反斜杠?
解决方案
\n
是单个字符。如果我们\n
在类似的字符串中使用"Hello\nWorld!"
,那么结果列表如下所示['H','e','l','l','o','\n','W','o','r','l','d','!']
:\n
表示换行符,单个 ASCII 字节10
。但是,由于在许多编程语言中输入换行符并不容易,因此\n
在字符串文字中使用了转义序列。
如果要在换行符上进行模式匹配,则必须使用整个转义序列:
replace :: String -> String
replace ('\n':xs) = ' ' : replace xs
replace (x:xs) = x : replace xs
replace "" = ""
否则,您将只匹配文字\
。
练习:现在replace
可行,尝试使用map
而不是显式递归。
推荐阅读
- jupyter-notebook - 为什么我的 Kaggle 笔记本看起来像 JSON
- python - 使用 python 和 Kafka 的 Spark Structured Streaming 给出错误
- html - 将使用无序列表编写的 HTML 表格提取到 Google 表格中
- javascript - 在 jQuery 中识别特定 td 的 tr 的第 n 个孩子
- node.js - 如何使用 Express 将 CSS 和 JS 添加到我的 Node localhost 服务器?
- flutter - Flutter setSystemUIOverlayStyle 启动时不执行
- javascript - JavaScript - 从日期中减去时间
- ios - SwiftUI / 在圆圈中添加照片
- reactjs - 使用 React Router Switch 时取消 React 中的 Axios 请求
- c - C - 图表 - 如何添加根检查以查找关节点