我的文本文件包含以下行:
[aex-ESE14 -14] this is a line
我有:
:mod +Text.Regex.Posix
如何仅过滤具有上述模式的行并将内容提取为两个字符串:
(String, String) = ("aex-ESE14 -14","this is a line")
答案 0 :(得分:1)
这是一种可行的方法:
Prelude> :mod +Text.Regex.Posix
Prelude Text.Regex.Posix> let res = "[aex-ESE14 -14] this is a line" =~ "(\\[[^][]+])[[:blank:]]+(.+)" :: [[String]]
Prelude Text.Regex.Posix> res
[["[aex-ESE14 -14] this is a line","[aex-ESE14 -14]","this is a line"]]
Prelude Text.Regex.Posix> res!!0!!1
"[aex-ESE14 -14]"
Prelude Text.Regex.Posix> res!!0!!2
"this is a line"
重点是匹配并捕获您需要返回的模式部分,其余部分可以匹配。为确保[...]
位于字符串的开头,您可以在模式的开头添加^
。
模式详情
(\\[[^][]+])
- 第1组:[
后跟一个或多个除[
和]
以外的字符,然后是]
[[:blank:]]+
- 一个或多个水平空格字符(.+)
- 一个或多个字符。如果某些模式可能出现0次或更多次,请将相应的+
替换为*
量词。